在Java中查找ArrayList中的项目?

时间:2011-12-03 21:57:20

标签: java arraylist

在C#中,在ArrayList中查找具有特定属性的项目,非常简单:

mSelectedBoard = mBoardConnections.FirstOrDefault(bcd => bcd.Id == id);

这是我发现在Java中做的最简单的事情(希望我能买得起MonoTouch for android):

for ( BoardConnectionData bcd : mBoardConnections ) {
    if (bcd.getID() == id) {
      mSelectedBoard = bcd;
      break;
    }
}

我错过了一种更简单的方法吗?

谢谢!

8 个答案:

答案 0 :(得分:1)

定义有意义的equals并使用Collection.contains

有许多实用程序库包含使用各种“我是吗?”的实现。实现。 (GuavaCommons Collections等。)

另一种选择是创建一个类型集合,其中包含按任意条件查找元素的实用程序方法。

在任何情况下,显示的代码段都不应该存在于主线代码中,它应该被抽象为自己的方法,无论它最终生活在哪里。

答案 1 :(得分:0)

如果您需要匹配单个属性,并且列表中的多个项目可以具有该属性的相同值,那么您需要像往常一样循环。 Java有一个Collections实用程序类,带有一堆静态方法;您可以定义自己的集合实用程序方法来处理这样的情况。

一般情况下,如果您不想找到元素,只需使用indexOf并确保正确实施equals

答案 2 :(得分:0)

由于Java中没有闭包,因此没有更简单的方法。当然,你可以使用Guava,但恕我直言,它只提供了一些简洁性,因为很多复杂性(对于你的例子,最后,因为番石榴很酷),

答案 3 :(得分:0)

假设BoardConnectionData类根据ID正确覆盖equals方法,以下内容应告诉您对象是否在列表中:

mBoardConnections.contains(object);

答案 4 :(得分:0)

如果您继承Comparable以测试ID成员并使用SortedSet

BoardConnectionData brd = 
sortedSet.tailSet(new BoardConnectionData(searchedId)).first();

复杂性并不是更高效,但它是更短的代码。 :)

答案 5 :(得分:0)

继续戴夫牛顿的回答。 CollectionArrayList,因此在equals上使用适当的hashCode(加BoardConnectionData)实施,indexOf方法将允许表达式

selectedBoard = boardConnections.getAt(boardConnections.indexOf(new BoardConnectionData(id)))

当然,最好只构建一个探测对象,而不是仅从id创建一个完整的实例。

答案 6 :(得分:0)

你真的应该问问自己ArrayList是否是正确的数据结构。鉴于类似的任务,我会选择Map。 C#和Java都需要O(N)来搜索数组。使用地图是O(1)。如果这是你经常需要的东西那么我会建议正确的结构。

C#和Java版本之间的唯一区别是,一个更短并且使用了闭包。正如许多其他人所建议的那样,你可以对一些现有的库做同样的事情。实际上没有人显示任何代码。使用番石榴,你可以做到:

Iterables.find(new Predicate<Data>(){
public boolean apply(Data d){
 return d.id == someId;
)}, list);

或者,如果您想要默认值,可以使用.find(predicate, list, defaultValue)

答案 7 :(得分:0)

在Java 8中,您可以这样做:

mSelectedBoard = mBoardConnections
    .stream().filter(bcd -> bcd.Id == id).findFirst().orElse(null);