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

Java 如何按2个浮点属性对ArrayList中的对象进行排序?,java,sorting,arraylist,Java,Sorting,Arraylist,我的目标是对类的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 An

我的目标是对类的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) );

    //...//
在绘制指令之前,如何对数组列表进行排序? 按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));
        }   
您可以使用对ArrayList进行排序,但AnisSprite必须实现该接口,以便让排序方法知道如何比较两个AnisSprite对象

您可以使用对ArrayList进行排序,但AnisSprite必须实现该接口,以便让排序方法知道如何比较两个AnisSprite对象


有两种简单的方法可以实现你想要的。两者都归结为数组元素应该相互比较的想法

备选案文1:

在AnimSprite中实现可比较的接口。将compareTo定义为您必须使用的方法,因为您实现了依赖2个数字进行比较的接口

然后使用:

Collections.sort(yourArray);
备选案文2:

当你不能真正改变Anisprite类时可以使用。在这种情况下,您可以实现有效外部化比较逻辑的比较器接口:

Collections.sort(yourArray, new Comparator<AnimSprite> {
     public int compare(AnimSprite s1, AnimSprite s2) {
                ...
     }
 });

当然,如果您使用的是java 8+,也可以使用lambda。有两种简单的方法可以实现您想要的。两者都归结为数组元素应该相互比较的想法

备选案文1:

在AnimSprite中实现可比较的接口。将compareTo定义为您必须使用的方法,因为您实现了依赖2个数字进行比较的接口

然后使用:

Collections.sort(yourArray);
备选案文2:

当你不能真正改变Anisprite类时可以使用。在这种情况下,您可以实现有效外部化比较逻辑的比较器接口:

Collections.sort(yourArray, new Comparator<AnimSprite> {
     public int compare(AnimSprite s1, AnimSprite s2) {
                ...
     }
 });

当然,如果您使用的是java 8+,也可以使用lambda。您也可以这样做:

    Collections.sort(list,
            Comparator.comparing((AnimSprite a) -> a.z)
                    .thenComparing((AnimSprite a) -> a.y));

对。您也可以这样做:

    Collections.sort(list,
            Comparator.comparing((AnimSprite a) -> a.z)
                    .thenComparing((AnimSprite a) -> a.y));


我建议您自己使用Comparator接口进行尝试:。如果您仍然有困难,请回复,我们可以解决。这不是主题本身,但我建议尽可能使用接口而不是类,例如:ArrayList listofsprites=new ArrayList;应该是List listofsprites=new ArrayList;谢谢,但最后一点是按2个浮点集合排序。SortList请将重点放在按2个浮点属性进行排序上。我建议您自己使用Comparator接口进行尝试:。如果您仍然有困难,请回复,我们可以解决。这不是主题本身,但我建议尽可能使用接口而不是类,例如:ArrayList listofsprites=new ArrayList;应该是List listofsprites=new ArrayList;谢谢,但最后一点是按2个浮点集合排序。SortList请注意按2个浮点属性排序。谢谢,我继续使用可比较的界面。但是,我无法找到两个属性排序的最简单方法,例如y和z?@Chronoslog请参见我的编辑:我在lambdaI中实现了比较逻辑,它将转到第一个选项,在响应时间M1>291537纳秒@Override方面更有效。。。CompareTanimsprite o而M2>48145753 nanoECS Collections.sortlistofsprites,s1,s2->…谢谢,我使用了可比较的界面。但是,我无法找到两个属性排序的最简单方法,例如y和z?@Chronoslog请参见我的编辑:我在lambdaI中实现了比较逻辑,它将转到第一个选项,在响应时间M1>291537纳秒@Override方面更有效。。。CompareTanimsprite o而M2>48145753 nanoSecs Collections.sortlistofsprites,s1,s2->…抱歉的问题不是如何对java对象排序,而是特定于按2个浮点非整数或字符串或其他…抱歉的问题不是如何对java对象排序,而是特定于按2个浮点非整数,或者字符串或其他什么…谢谢,它可以工作,但执行时间更长:M1>291537 nanoSecs@Override。。。与Animesprite o M2>48145753 nanoSecs系列相比。sortlistofsprites,s1,s2->。。。M3>48187767 nanoSecs比较器。比较Nimsprite a->a.z…然后比较…谢谢您它可以工作,但执行时间更长:M1>291537 nanoSecs@Override。。。与Animesprite o M2>48145753 nanoSecs系列相比。sortlistofsprites,s1,s2->。。。M3>48187767纳秒比较器。比较Nimsprite a->a.z….然后比较。。。