2014-05-01 2 views
0
@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; 
    } 

Обзор:Сортировка списка после вставки

  • Dish -> Парам: ArrayList<Ingredient> ingredients

  • Dish -> Функцион: containsIngredient(Collection<Ingredient> ingredients) : int (возвращает Int процент howmany ингредиенты данная коллекция имеет с тарелка)

Пример:

  • Для заданных ингредиентом Коллекция = [X, Y, Z]

    • блюду = [Ингредиенты: [X, Y, Z]] ->dishA.containsIngredient(ingredientCollection) = 1

    • тарелка B = [Ингредиенты: [W, X, Y, Z]], ->dishB.containsIngredient(ingredientCollection) = 0,75

    • D ish C = [Ингредиенты: [U, V, W]]; ->dishC.containsIngredient(ingredientCollection) = 0

Вопрос

Я хочу, чтобы вернуть коллекцию всех блюд, которые содержат указанные ингредиенты упорядочены с теми, которые имеют самый высокий процент общего ингредиенты сначала. Я подумывал написать класс Collection, в который я добавляю дополнительный параметр для функции add. Но это, кажется, довольно далеко. Я что-то пропустил?

+0

http://stackoverflow.com/questions/6957631/sort-java-collection –

+0

Обратите внимание, что процент не является параметром. Блюда. –

+0

Затем создайте DishWrapper, который включает процент и сравнивает его (как показано в ссылке, помещенной Анной). После сортировки списка DishWrapper вы можете «развернуть» в обычный список блюд. – vanOekel

ответ

0

Чистый объектно-ориентированный способ решения этой проблемы - реализовать интерфейс java.lang.Comparable для вашего объекта. Затем вы можете использовать любой способ упорядочивания, предоставляемый классом Collections.

Я немного изменил спецификации: вместо того, чтобы использовать метод containsIngredient (Collection components), я сохраняю состояние ингредиентов в самом предмете блюда. Это облегчает сравнение с другими предметами тарелки.

Таким образом, ваш выше цикл будет:

for (Dish currentDish : this.getAll()) { 
     currentDish.setIngredients(ingredients); 
     if (currentDish.getPercentageOfIngredientsContained() != 0) { 
      result.add(currentDish); 
     } 
    } 

А вот что класс 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; 
    } 
    } 
} 

С Блюдо реализована таким образом, вы можете сортировать список блюд с использованием Collections.sort (блюда), и они будут сортироваться по проценту содержащихся ингредиентов.

+0

Скажите, 'currentDish.getPercentageOfIngredientsContained() 'как вы вычисляете процент от этого? Цель этой функции заключалась в том, чтобы рассчитать, насколько данная коллекция ингредиентов имеет общее с блюдом. –

+0

Я не собираюсь писать * все * код для ya ... :-p Попробуйте представить ингредиенты как Sets. (java.util.HashSet) Найдите пересечение множеств. Разделите количество ингредиентов на пересечении, заданное общим количеством ингредиентов для конкретного блюда. –

Смежные вопросы