在Java集合中搜索。为什么这么难?

时间:2010-02-13 21:11:50

标签: c# java collections

有没有合理的解释,为什么在Java集合中搜索元素是如此困难? 例如,假设我有:

ArrayList<People> listPeople = new ArrayList<People>();

public class People
{
   public String name;
   public String age;
   //some other code here
}

你明白了......现在,如果我想从列表中获得一个具有给定名称的人,让我们说'Anthares'我必须做很多工作:创建一个名为'Anthares'的新人,可能是它与其他一些数据一起,为Person类预定义我的equals方法,然后调用listPeople.IndexOf(tempPerson),最后得到返回的int并make listPeople [idx]

为什么这一切都是痛苦的。例如,在C#中我可以创建一个linq表达式,将它传递给我收集的正确方法,就是这样。一行简单的代码。

7 个答案:

答案 0 :(得分:6)

不,你不 - 你能做到:

Person found = null;
for (Person person : listPeople)
{
    if ("Anthares".equals(person.name))
    {
        found = person;
        break;
    }
}
// Check for found == null etc

是的,它仍然比LINQ更多的工作,但这基本上是因为C#以lambda表达式的形式有闭包。如果你愿意写,你可以在Java中实现类似的东西:

Person person = FakeLinq.findFirst(listPeople, new Predicate<Person>() {
    @Override boolean matches(Person person) {
        return person.name.equals("Anthares");
    }
});

C#解决方案的大多数简洁性只是让您非常简单地表达该谓词。

Java 7(希望!)有一些合理类似于lambda表达式的东西,此时这在Java中也变得可行。

答案 1 :(得分:4)

查看Apache Commons集合api,特别是CollectionUtils.find

答案 2 :(得分:2)

for(Person p : listPeople) {
  if(p.name.equals("Anthares")) {
    found = p;
    break;
  }
}

你很可能在使用jdk7的C#中完成它。

答案 3 :(得分:1)

在我看来,他们在Java集合类中犯了一个愚蠢的错误,使问题复杂化。当你执行Collection.indexOf(想要)时,他们搜索集合说,基本上是“if(want.equals(collectionMember))”而不是“if(collectionMember.equals(want))”。

我认为后者本来会更好,因为它可以让你简单地编写一个“MyObject.equals(String)”函数或“MyObject.equals(Integer)”,即将你的自定义对象与一般对象进行比较。然后你可以实现它,比如......

public boolean equals(String wantname)
{
  return this.name.equals(wantname);
}

但是因为它实际上实现为“if(want.equals(collectionMember))”,当然Java String类没有“equals(MyObject)”函数,所以你不能只给它一个字符串搜索。相反,您必须创建一个虚拟对象来保存您想要查找的值。

是的,正如其他海报所表明的那样,编写快速功能来顺序搜索集合并不是什么大问题。但是,如果我们谈论的是一个顺序搜索不实用或有效的集合,比如HashMap或树结构呢?

答案 4 :(得分:1)

使用lambdaj,您可以轻松实现该结果:

select(listPeople, having(on(Person.class).getName(), equalTo("Anthares"))

答案 5 :(得分:0)

如果你想搜索,你应该在一个人的名字上使用HashMap / HashTable和哈希。

如果在Java中实现linq,则不需要:)

答案 6 :(得分:0)

您可以使用迭代器,然后将name字段与您要搜索的名称进行比较(所有这些都只涉及使用Java API)

此外,HashMap可能是一个更好的数据结构,可以看看你在这个例子中如何使用name作为“键”。

问题不在于java集合,而在于您选择的数据结构/实现。