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

我旨在对类的数组列表进行排序

created_at

然后我当然要循环绘制

 public class AnimSprite
    {
    float x,y,z;
    //...//
    }

ArrayList<AnimSprite> listofsprites = new ArrayList<AnimSprite>();

    //...//

list.add( new AnimSprite(1f,10f,0f) );      //x,z
list.add( new AnimSprite(15f,25f,1f) );
list.add( new AnimSprite(30f,-62f,0f) );
list.add( new AnimSprite(150f,2f) );
list.add( new AnimSprite(55f,-65f,0f) );

    //...//

在绘制指令之前,我们如何对数组列表进行排序? (按y升序,然后z升序排列)

例如预期结果:

for (AnimSprite s: listofsprites) { s.draw();}

目前,如下所示,我按y和z升序排列,但是我不确定这是最新技术吗?

obj0 -> AnimSprite(55f,0f)
obj1 -> AnimSprite(30f,0f) 
obj2 -> AnimSprite(1f,0f)
obj3 -> AnimSprite(15f,1f)
obj4 -> AnimSprite(150f,2f)
scscsc1980 回答:如何按2个float属性对ArrayList中的对象进行排序?

您可以使用Collection.sort(list)ArrayList进行排序,但是AnimSprite必须实现Comparable接口,以使sort方法知道如何比较两个{ {1}}个对象。

AnimSprite

另一种解决方案是使用接受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,z listofsprites.add( new AnimSprite(15f,25f,1f) ); listofsprites.add( new AnimSprite(30f,-62f,0f) ); listofsprites.add( new AnimSprite(150f,2f) ); listofsprites.add( new AnimSprite(55f,-65f,0f) ); //...// Collection.sort(listofsprites); for (AnimSprite s: listofsprites) { s.draw();} 实现作为第二个参数的重载方法sort,并使用Lambda expression编写更少的代码:

Comparator
,

有两种简单的方法可以实现您想要的。两者都归结为数组元素之间应该是“可比较的”。

选项1:

def parse(self,response): print('### SCANNED: %s',(response.request.url)) if len(response.css('script').getall()) > 0: yield { 'domain': response.meta['domain'],'scripts': response.css('script').getall() } 中实施 def process_item(self,item,spider): domain = item['domain'] scripts = item['scripts'] for script in scripts: # There are about 15 scripts per item for script_group in self.script_groups: # There are about 5000 script_groups # Check all urls in script_group to see if script_group is being used for url in script_group['urls']: # There are about 2 urls per script_group # If at least one url found then script_group is being used if url in script: print("url found,script_group is being used") break return item 接口。定义Comparable方法(自从实现接口以来,您将必须使用该方法)以依靠2个数字进行比较。

然后使用:

AnimSprite

选项2:

在您无法真正更改compareTo类时可以使用。在这种情况下,您可以实现Collections.sort(yourArray); 接口,以有效地外部化比较逻辑:

AnimSprite

如果您使用的是Java 8+,当然也可以使用lambda

,

是的。您还可以执行以下操作:

    Collections.sort(list,Comparator.comparing((AnimSprite a) -> a.z)
                    .thenComparing((AnimSprite a) -> a.y));
本文链接:https://www.f2er.com/3160405.html

大家都在问