Java の ArrayList に問題があります。x と y の 2 つの属性を含むオブジェクトを作成しました。これで、ArrayList にオブジェクトをロードしました。問題は、検索している x 属性を持つオブジェクトのインデックスを見つける方法がわからないことです。これを行う方法はありますか?
4 に答える
これはあなたが探しているものですか?
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());
}
次のようなものを想定します。
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
。size()
本当にインデックスが必要な場合は、 andを使用して、インデックス付き for ループを使用することをお勧めしますget(int index)
(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>
こちらもご覧ください
リストを反復処理して、すべての要素をテストするだけです。
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までは、他に標準的な方法はありません。
1つの特定の属性値に基づいてコレクションからオブジェクトをフェッチできるようにする場合は、通常、マップを使用します。リストを反復処理するよりもクリーンだと思います。
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を検討してください。