配列リストがA
あり、2つのオブジェクトを比較するとA
しますa.getDistanceFromPlayer() < b.getDistanceFromPlayer()
。
B
のすべてのオブジェクトを含むリストを作成したいのですA
が、最初のオブジェクトがプレーヤーに最も近く、最後のオブジェクトが最も遠い場所でソートされています。
これを行うための最速の方法は何でしょうか?
ありがとう
配列リストがA
あり、2つのオブジェクトを比較するとA
しますa.getDistanceFromPlayer() < b.getDistanceFromPlayer()
。
B
のすべてのオブジェクトを含むリストを作成したいのですA
が、最初のオブジェクトがプレーヤーに最も近く、最後のオブジェクトが最も遠い場所でソートされています。
これを行うための最速の方法は何でしょうか?
ありがとう
クラスにComparableを実装させる必要があります。
次に、Collections.sort()を使用してリストを並べ替えることができます。
ソートされたリストとソートされていないリストが必要な場合は、コピーを作成する必要があります。
もう1つのオプションは、コンパレータを作成することです。
コレクションのドキュメントを読むと、 2つの並べ替え方法があることがわかります。
1つは、オブジェクトのcompareToメソッド(つまり、オブジェクトの「自然な順序」)に基づいて並べ替えます。
もう1つは、2番目の引数として渡されるコンパレータに基づいてソートされます。
Comparableの実装例を提供する別の質問へのリンクは次のとおりです。
カスタムコンパレータでCollections.sortを使用します。
eg.
public class DistanceComparator implements Comparator<Integer>{
@Override
public int compare(YourObject o1, YourObject o2) {
if (o1.getDistanceFromPlayer() > o2.getDistanceFromPlayer())
{
return 1;
}
else if (o1.getDistanceFromPlayer() < o2.getDistanceFromPlayer())
{
return -1;
}
return 0;
}
}
次に、プログラムで、
Collections.sort(YourArrayInstance, new DistanceComparator())
Comparableを実装してから、次のようにメソッドcompareTo(Object other)を定義します。
public int compareTo(Object other) {
if( this.getDistanceFromPlayer() < other.getDistanceFromPlayer() ) {
return -1;
} else if( this.getDistanceFromPlayer() > other.getDistanceFromPlayer()) {
return 1;
}
return 0;
}
これで、オブジェクトのリストでCollections.sort()を呼び出すことができます
を使用しCustom Comparator
ます:
B = Collections.sort(A, new CustomComparator());
public class CustomComparator implements Comparator<ClassA> {
@Override
public int compare(final ClassA a, final ClassA b) {
//Make sure you check that neither a nor b are null..
//..
if (a.getDistanceFromPlayer() < b.getDistanceFromPlayer()) {
return 1;
} else if (a.getDistanceFromPlayer() > b.getDistanceFromPlayer()) {
return -1;
}
return 0;
}
}
次のように、カスタムコンパレータを使用してArrayListを並べ替えることができます。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Main {
public static class Player {
private final float distance;
public Player (final float position) {
this.distance = position;
}
public float getDistanceFrom () {
return distance;
}
@Override
public String toString() {
return "Player [distance=" + distance + "]";
}
}
public static void main(String[] args) throws Exception {
final ArrayList<Player> players = new ArrayList<Player> ();
players.add (new Player (2));
players.add (new Player (5));
players.add (new Player (-3));
players.add (new Player (1));
Collections.sort(players, new Comparator<Player> () {
@Override
public int compare(Player o1, Player o2) {
final float distance1 = o1.getDistanceFrom();
final float distance2 = o2.getDistanceFrom();
return (int) Math.signum (distance1 - distance2);
}
});
System.out.println(players);
}
}
そしてそれのためのフィドル。