假设有类似的东西:
public class Point {
public final int x;
public final int y;
}
Run Code Online (Sandbox Code Playgroud)
并声明:
List<Point> points = ...;
Run Code Online (Sandbox Code Playgroud)
您可以使用for-each迭代所有点并找到您想要的点:
for (Point p : points) {
if (p.x == targetX) {
process(p);
break; // optional
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不会给你索引,但它会给你Point自己,这有时是足够的.如果你真的需要索引,那么你想使用索引for循环,使用size()和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之类的TreeSet,特别是如果你拥有的是a Set<Point>,而不是a List<Point>.
这是你要找的?
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());
}
Run Code Online (Sandbox Code Playgroud)
}
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));
}
Run Code Online (Sandbox Code Playgroud)
}
如果您只想搜索x属性,请更改equals方法以仅比较x值,如:
@Override
public boolean equals(Object o) {
return (o instanceof Point && getX() == ((Point) o).getX());
}
Run Code Online (Sandbox Code Playgroud)
只需迭代列表并测试每个元素.
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.
}
}
Run Code Online (Sandbox Code Playgroud)
详细,是的,但可能直到带有闭包的 JDK7,没有其他标准方法.
| 归档时间: |
|
| 查看次数: |
11362 次 |
| 最近记录: |