插入时排序列表

时间:2014-05-01 20:31:50

标签: java sorting collections

@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类,我在这个百分比的'添加'功能中添加了一个额外的参数。但这似乎远远不够。我错过了什么吗?

1 个答案:

答案 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(菜肴)对任何菜肴列表进行排序,并按照所含成分的百分比对其进行分类。