3

我对 Java 的 ArrayList 有疑问。我创建了一个包含两个属性 x 和 y 的对象。现在我已经在我的 ArrayList 中加载了一些对象。问题是我不知道如何找到我正在搜索的具有 x 属性的某个对象的索引。有没有办法做到这一点?

4

4 回答 4

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

请注意,这不会给你index,但它会给你它Point本身,这有时就足够了。如果你真的需要索引,那么你会想要使用索引 for 循环,使用size()and get(int index)(参见 BalusC 的答案)。

也可以看看


上述解决方案搜索O(N)每个targetX. 如果您经常这样做,那么您可以通过声明class Point implementsComparable<Point>,x用作Collections.sort.

然后就可以了Collections.binarySearch。设置时间为O(N log N),现在可以在 中回答每个查询O(log N)

另一种选择是使用SortedSet诸如 a 之类的 a TreeSet,尤其是当您拥有的是 aSet<Point>而不是 a 时List<Point>

也可以看看

于 2010-05-05T00:30:52.667 回答
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());

}
于 2010-05-05T04:27:46.437 回答
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.
    }
}

详细,是的,但可能直到 JDK7 with Closures,没有其他标准方式。

于 2010-05-05T00:18:52.167 回答
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。

于 2010-05-05T10:05:07.497 回答