1

我有一个像这样的抽象类:

public abstract class Ingredient {
    protected int id;
}

和一份清单

List <Ingredient> ingredientList = new ArrayList <Ingredient>()

我希望能够从ingredientList使用 id 中获取成分。

我做了这样的事情:

public abstract class Ingredient implements Comparable<Ingredient>{
        protected int id;
        @Override
    public int compareTo(Ingredient o) {
        // TODO Auto-generated method stub
        if (this.id > o.id){
            return 1;
        }
        return 0;
    }
    } 

但仍然无法正常工作

4

7 回答 7

2

如果您需要执行定期查找, aMap可能是在这里使用的更好集合:

Map<Integer, Ingredient> ingredientMap = new HashMap<>();
于 2013-01-31T20:26:56.120 回答
2
for (Ingredient ingredient : IngredientList) {
  if (ingredient.getId() == id) {
    System.out.println("found");
  }
}
System.out.println("not found");
于 2013-01-31T20:29:02.930 回答
1

如果您使用Eclipse Collections,您可以使用检测方法。

final int idToFind = ...;
ListIterable<Ingredient> ingredientList = FastList.newListWith(...);
Ingredient ingredient = ingredientList.detect(new Predicate<Ingredient>()
{
    public boolean accept(Ingredient eachIngredient)
    {
        return eachIngredient.getId() == idToFind;
    }
});

如果您无法更改成分列表的类型,您仍然可以使用静态实用程序形式的检测。

Ingredient ingredient = ListIterate.detect(ingredientList, new Predicate<Ingredient>()
{
    public boolean accept(Ingredient eachIngredient)
    {
        return eachIngredient.getId() == idToFind;
    }
});

当 Java 8 发布 lambdas 时,您将能够将代码缩短为:

Ingredient ingredient = ingredientList.detect(eachIngredient -> eachIngredient.getId() == idToFind);

注意:我是 Eclipse 集合的提交者。

于 2013-02-01T18:25:04.457 回答
0

你可以做(​​在你的班级内)

interface Callback { public void handle(Indredient found); }

public void search(List<Ingredient> ingredientList, int id, Callback callback) { 
  for(Ingredient i : ingredientList) if(i.id == id) callback.handle(i)
} 

接着

ingredients.search ( 10, new Callback() { 
       public void handle(Ingredient found) {
            System.out.println(found);
       }
   });

或类似的东西...

ps.:我在你改变你的问题之前回答了;)

于 2013-01-31T20:26:49.577 回答
0

只是一个猜测,但这可能是你的意思:

在 Java 的 ArrayList 中使用包含的最佳方法?

列表的 contains() 方法使用 equals() 和 hashCode()

于 2013-01-31T20:27:51.353 回答
0

当您使用List.contains()id 查找成分时,然后覆盖 equals()hashCode() { return id};

在 equals() 中:在 equals 中比较 this.id 和 other.id 。

于 2013-01-31T20:27:59.697 回答
0
public Ingredient getIngredientById(int id) {
   for (Ingredient ingredient : ingredientList) {
      if (ingredient.id == id) {
         return ingredient;
      }
   }
}
于 2013-01-31T20:30:56.760 回答