java - 如何按 2 个浮点属性对 ArrayList 中的对象进行排序?

标签 java sorting arraylist

我的目标是对一个类的数组列表进行排序

 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 必须实现 Comparablesort 方法知道如何比较两个 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/

相关文章:

java - 非动态未排序数组列表的删除不会是 O(n) 吗?

java - firstLast Java链表/节点

c - 优化 O(n^2) 到 O(n)(未排序的字符串)

java - Android类被调用两次

python - Pandas.sort_index 不按第二个给定参数排序

mongodb - 过滤和排序 以下哪些查询将使用索引?

java - 以 Java 8 方式检查对象中包含的空对象和空值

java - 如何初始化存储在另一个 Activity 的 Pojo 类中的 arraylist?

java - 使用 Hibernate 在 PostgreSQL 中进行 JSON 键搜索

java - 如何使用JAVA从字符串中获取一个子字符串的特定值?