在C#中,在ArrayList中查找具有特定属性的项目,非常简单:
mSelectedBoard = mBoardConnections.FirstOrDefault(bcd => bcd.Id == id);
这是我发现在Java中做的最简单的事情(希望我能买得起MonoTouch for android):
for ( BoardConnectionData bcd : mBoardConnections ) {
if (bcd.getID() == id) {
mSelectedBoard = bcd;
break;
}
}
我错过了一种更简单的方法吗?
谢谢!
答案 0 :(得分:1)
定义有意义的 equals
并使用Collection.contains
。
有许多实用程序库包含使用各种“我是吗?”的实现。实现。 (Guava,Commons 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)
继续戴夫牛顿的回答。 Collection
是ArrayList
,因此在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);