Java 如何按2个浮点属性对ArrayList中的对象进行排序?
我的目标是对类的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
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….然后比较。。。