我的对象的 ArrayList,indexOf 问题
Posted
技术标签:
【中文标题】我的对象的 ArrayList,indexOf 问题【英文标题】:ArrayList of my objects, indexOf problem 【发布时间】:2011-02-15 17:19:33 【问题描述】:我对 Java 的 ArrayList 有疑问。我创建了一个包含两个属性 x 和 y 的对象。现在我已经在我的 ArrayList 中加载了一些对象。问题是我不知道如何找到我正在搜索的具有 x 属性的某个对象的索引。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:假设如下:
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
本身,这有时就足够了。如果你真的需要索引,那么你会想要使用索引 for 循环,使用 size()
和 get(int index)
(请参阅 BalusC 的答案)。
另见
Java Language Guide: the for-each loopjava.util.List
API
上述解决方案在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>
。
另见
How to sort an array orArrayList<Point>
ASC first by x
and then by y
?
Java: What is the difference between implementing Comparable and Comparator?
【讨论】:
他对索引很感兴趣。 @BalusC:是的,我刚刚看到了[indexOf]
标签;参考你的答案而不是重复。【参考方案2】:
这是你要找的吗?
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());
【讨论】:
【参考方案3】:只需遍历列表并测试每个元素。
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,没有其他标准方式。
【讨论】:
【参考方案4】:如果我希望能够根据一个特定的属性值从集合中提取对象,我通常只使用映射。我发现这比遍历列表更简洁。
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。
【讨论】:
以上是关于我的对象的 ArrayList,indexOf 问题的主要内容,如果未能解决你的问题,请参考以下文章
Java - Arraylist中Arraylist中对象的排列
ArrayList的indexOf方法与重写equals方法