假设我有 arraylistA
并比较A
I do的 2 个对象a.getDistanceFromPlayer() < b.getDistanceFromPlayer()
。
我现在想要B
一个包含所有A
对象的列表,但在第一个对象最接近玩家的位置排序,最后一个对象最远。
最快的方法可能是什么?
谢谢
假设我有 arraylistA
并比较A
I do的 2 个对象a.getDistanceFromPlayer() < b.getDistanceFromPlayer()
。
我现在想要B
一个包含所有A
对象的列表,但在第一个对象最接近玩家的位置排序,最后一个对象最远。
最快的方法可能是什么?
谢谢
你应该让你的班级实现Comparabl e。
然后您可以使用Collections.sort()对您的列表进行排序。
如果你想要一个排序的列表和一个未排序的列表,你必须制作一个副本。
另一种选择是创建一个Comparator。
如果您阅读Collections 的文档,您会看到它有两种排序方法。
一种基于对象的compareTo方法(即它们的“自然顺序”)进行排序。
另一个基于作为第二个参数传递的 Comparator 进行排序。
这是另一个问题的链接,它提供了 Comparable 的示例实现:
Use Collections.sort with a custom comparator.
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;
}
}
Then in your program, call
Collections.sort(YourArrayInstance, new DistanceComparator())
让 A 实现 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;
}
}
您可以使用自定义Comparator并对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);
}
}
和一个小提琴。