使用class属性搜索Java集合

时间:2013-01-31 20:20:09

标签: java search collections

我有一个这样的抽象类:

public abstract class Ingredient {
    protected int id;
}

和一个清单

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

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

我做了类似的事情:

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;
    }
    } 

但仍无法正常工作

7 个答案:

答案 0 :(得分:2)

如果您需要执行常规查找,Map可能是一个更好的集合,可以在这里使用:

Map<Integer, Ingredient> ingredientMap = new HashMap<>();

答案 1 :(得分:2)

for (Ingredient ingredient : IngredientList) {
  if (ingredient.getId() == id) {
    System.out.println("found");
  }
}
System.out.println("not found");

答案 2 :(得分: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;
    }
});

如果您无法更改ingredientList的类型,您仍然可以使用detect的静态实用程序形式。

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集合的提交者。

答案 3 :(得分: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。:我在你改变了问题之前回答了问题;)

答案 4 :(得分:0)

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

Best way to use contains in an ArrayList in Java?

list的contains()方法使用equals()和hashCode()

答案 5 :(得分:0)

当您使用List.contains()查找包含ID的成分时,请覆盖equals()hashCode() { return id};

在equals()中:将this.id与other.id相等。

答案 6 :(得分:0)

public Ingredient getIngredientById(int id) {
   for (Ingredient ingredient : ingredientList) {
      if (ingredient.id == id) {
         return ingredient;
      }
   }
}