@Override
public Collection<Dish> getDishesContaining(Collection<Ingredient> ingredients) throws DatabaseException {
Collection<Dish> result = new ArrayList<>();
for (Dish currentDish : this.getAll()) {
if (currentDish.containsIngredient(ingredients)!=0) {
result.add(currentDish);
}
}
return result;
}
概述:
菜 - &gt; Param:ArrayList<Ingredient> ingredients
菜 - &gt;功能:containsIngredient(Collection<Ingredient> ingredients) : int
(返回给定收藏品与菜肴的比例的百分比)
示例:
对于给定的成分收集= [X,Y,Z]
菜A = [成分:[X,Y,Z]], - &gt; dishA.containsIngredient(ingredientCollection)
= 1
菜B = [成分:[W,X,Y,Z]], - > dishB.containsIngredient(ingredientCollection)
= 0,75
菜C = [成分:[U,V,W]]; - &GT; dishC.containsIngredient(ingredientCollection)
= 0
问题
我想要回收所有含有给定成分有序的菜肴的集合,其中含有最常见成分百分比的菜肴。 我正在考虑写一个Collection类,我在这个百分比的'添加'功能中添加了一个额外的参数。但这似乎远远不够。我错过了什么吗?
答案 0 :(得分:0)
解决此问题的干净,面向对象的方法是为您的对象实现java.lang.Comparable接口。然后,您可以使用Collections类提供的任何排序方法。
我稍微改变了你的规格:我没有使用containsIngredient(收集成分)方法,而是在菜肴对象本身中存储成分的状态。这样可以更容易地与其他菜肴对象进行比较。
因此,您的上述for循环将是:
for (Dish currentDish : this.getAll()) {
currentDish.setIngredients(ingredients);
if (currentDish.getPercentageOfIngredientsContained() != 0) {
result.add(currentDish);
}
}
这就是实现Comparable的Dish类看起来像:
import java.util.ArrayList;
import java.lang.Comparable;
public class Dish implements Comparable<Dish> {
ArrayList<Ingredient> _ingredients = null;
int _percentageOfIngredientsContained = 0;
public ArrayList<Ingredient> getIngredients() {
return _ingredients;
}
public void setIngredients(ArrayList<Ingredient> ingredients) {
_ingredients = ingredients;
computeIngredientsContained();
}
public int getPercentageOfIngredientsContained() {
return _percentageOfIngredientsContained;
}
private void computeIngredientsContained() {
int percent = 0;
// Calculate percentage by looking at _ingredients...
// ...
// ...
_percentageOfIngredientsContained = percent;
}
// Implement Comparable
@Override
public int compareTo(Dish anotherDishObject) {
if (this.getPercentageOfIngredientsContained() < anotherDishObject.getPercentageOfIngredientsContained()) {
return -1;
}
else if (this.getPercentageOfIngredientsContained() == anotherDishObject.getPercentageOfIngredientsContained()) {
return 0;
}
else {
return 1;
}
}
}
通过这种方式实施Dish,您可以使用Collections.sort(菜肴)对任何菜肴列表进行排序,并按照所含成分的百分比对其进行分类。