我的目标是对一个类的数组列表进行排序
public class AnimSprite
{
float x,y,z;
//...//
}
ArrayList<AnimSprite> listofsprites = new ArrayList<AnimSprite>();
//...//
list.add( new AnimSprite(1f,10f,0f) ); //x,y,z
list.add( new AnimSprite(15f,25f,1f) );
list.add( new AnimSprite(30f,-62f,0f) );
list.add( new AnimSprite(150f,-62f,2f) );
list.add( new AnimSprite(55f,-65f,0f) );
//...//
然后当然是循环画了
for (AnimSprite s: listofsprites) { s.draw();}
在绘制指令之前,我们如何对数组列表进行排序? (按 y 升序然后 z 升序排序)
例如预期结果:
obj0 -> AnimSprite(55f,-65f,0f)
obj1 -> AnimSprite(30f,-62f,0f)
obj2 -> AnimSprite(1f,10f,0f)
obj3 -> AnimSprite(15f,25f,1f)
obj4 -> AnimSprite(150f,-62f,2f)
目前,如下所示,我按 y 和 z 升序排序,但我不确定这是最先进的吗?
public static class AnimSprite implements Comparable<AnimSprite >
{
//...//
Override
public int compareTo(AnimSprite o)
{
float result = this.z - o.z;
if (result == 0f) result = this.y - o.y;
return ((int)(result));
}
最佳答案
您可以使用 Collection.sort(list)
对 ArrayList
进行排序,但 AnimSprite
必须实现 Comparable
让 sort
方法知道如何比较两个 AnimSprite
对象的接口(interface)。
public class AnimSprite implements Comparable
{
float x,y,z;
//...//
@Override
public int compareTo(AnimSprite o)
{
float result = this.z - o.z;
if (result == 0f) result = this.y - o.y;
return ((int)(result));
}
}
ArrayList<AnimSprite> listofsprites = new ArrayList<AnimSprite>();
//...//
listofsprites.add( new AnimSprite(1f,10f,0f) ); //x,y,z
listofsprites.add( new AnimSprite(15f,25f,1f) );
listofsprites.add( new AnimSprite(30f,-62f,0f) );
listofsprites.add( new AnimSprite(150f,-62f,2f) );
listofsprites.add( new AnimSprite(55f,-65f,0f) );
//...//
Collection.sort(listofsprites);
for (AnimSprite s: listofsprites) { s.draw();}
另一种解决方案是使用重载方法 sort
接受 Comparator
实现作为第二个参数,并使用 Lambda expression
编写更少的代码:
Collections.sort(listofsprites, (s1, s2) -> {
float result = s1.z - s2.z;
if (result == 0f) result = s1.y - s2.y;
return ((int)(result));
});
关于java - 如何按 2 个浮点属性对 ArrayList 中的对象进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58709451/