我的Java ArrayList有问题。我创建了一个Object,它包含两个属性x和y。现在我在ArrayList中加载了一些对象。问题是我不知道如何使用我正在搜索的x属性找到某个对象的索引。有没有办法做到这一点?
答案 0 :(得分:7)
假设有类似的东西:
public class Point {
public final int x;
public final int y;
}
声明:
List<Point> points = ...;
您可以使用for-each迭代所有点并找到您想要的点:
for (Point p : points) {
if (p.x == targetX) {
process(p);
break; // optional
}
}
请注意,这不会为您提供索引,但它会为您提供Point
本身,这有时就足够了。如果你真的需要索引,那么你想使用size()
和get(int index)
使用索引for循环(参见BalusC的回答)。
上述解决方案会在O(N)
中搜索每个targetX
。如果您经常这样做,那么您可以通过声明class Point implements
Comparable<Point>
,使用x
作为Collections.sort
的主要排序键来改善这一点。
然后你可以Collections.binarySearch
。如果设置时间为O(N log N)
,则现在可以在O(log N)
中回答每个查询。
另一种选择是使用SortedSet
,例如TreeSet
,尤其是如果你拥有的是Set<Point>
,而不是List<Point>
。
答案 1 :(得分:7)
这是你要找的吗?
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public boolean equals(Object o) {
return (o instanceof Point && getX() == ((Point) o).getX() && getY() == ((Point) o)
.getY());
}
}
public class TestIndexOf {
public static void main(String[] args){
Point p1 = new Point(10,30);
Point p2 = new Point(20,40);
Point p3 = new Point(50,40);
Point p4 = new Point(60,40);
List<Point> list = new ArrayList<Point>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println(list.indexOf(p3));
}
}
如果您只想搜索x属性,请更改equals方法以仅比较x值,如:
@Override
public boolean equals(Object o) {
return (o instanceof Point && getX() == ((Point) o).getX());
}
答案 2 :(得分:5)
只需遍历列表并测试每个元素。
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getX() == someValue) { // Or use equals() if it actually returns an Object.
// Found at index i. Break or return if necessary.
}
}
详细,是的,但可能直到带有Closures的JDK7,没有其他标准方法。
答案 3 :(得分:0)
如果我希望能够根据一个特定的属性值从集合中获取对象,我通常只使用地图。我发现它比不必遍历列表更清晰。
Map<String, Object> map = new HashMap<String, Object>();
map.put(o1.getX(), o1);
map.put(o2.getX(), o2);
现在,如果我想要x值为“foo”的对象,那么只需要
Object desiredObject = map.get("foo");
如果订单很重要,请考虑使用LinkedHashMap。