java list 排序性能_(转载)java list排序

1、简介

这个和数组的排序又不一样了。

其实Java针对数组和List的排序都有实现,对数组而言,你可以直接使用Arrays.sort,对于List和Vector而言,你可以使用Collections.sort方法。

Java API针对集合类型的排序提供了2个方法:

java.util.Collections.sort(java.util.List)

java.util.Collections.sort(java.util.List, java.util.Comparator)

如果集合里面的元素都是相同类型的,并且实现了Comparable接口,那么可以直接调用第一个方法。

如果你有其它的排序的想法,比如你不想按照自然排序进行,还可以传一个Comparator过去,比如反向。

元素不相同的情况比较复杂,可以暂时不用考虑。

2、通过实现Comparable接口来实现list的排序

假如现在我们有一个Person类的list集合,要让其按照一个Order属性进行排序,我们可以让Person类实现Comparable接口,重写其CompareTo方法即可。具体实现如下:

1)、Person实体类

public class Person implements Comparable{privateString name;privateInteger order;/***@returnthe name*/

publicString getName() {returnname;

}/***@paramname

* the name to set*/

public voidsetName(String name) {this.name =name;

}/***@returnthe order*/

publicInteger getOrder() {returnorder;

}/***@paramorder

* the order to set*/

public voidsetOrder(Integer order) {this.order =order;

}

@Overridepublic intcompareTo(Person arg0) {return this.getOrder().compareTo(arg0.getOrder()); //这里定义你排序的规则。

}

}

通过重写Comparable接口的compareTo方法,可以让程序按照我们想要的排列方式进行排序,如:这里我让Person按照order属性升序排序。

2)、测试类

public static voidmain(String[] args) {//初始化数据

List listA = new ArrayList();

Person p1= newPerson();

Person p2= newPerson();

Person p3= newPerson();

p1.setName("name1");

p1.setOrder(1);

p2.setName("name2");

p2.setOrder(2);

p3.setName("name3");

p3.setOrder(3);

listA.add(p2);

listA.add(p1);

listA.add(p3);//排序

Collections.sort(listA);//打印排序后的Person

for(Person p : listA) {

System.out.println(p.getName());

}

}

3)、结果:

name1

name2

name3

3、通过重载Collections.sort方法

直接重载java.util.Collections.sort(java.util.List, java.util.Comparator) 方法。可以灵活的修改我们排序的方式,具体实现如下:

1)、Person实体类

和上面的类相同,但没实现Comparable接口

public classPerson {privateString name;privateInteger order;/***@returnthe name*/

publicString getName() {returnname;

}/***@paramname

* the name to set*/

public voidsetName(String name) {this.name =name;

}/***@returnthe order*/

publicInteger getOrder() {returnorder;

}/***@paramorder

* the order to set*/

public voidsetOrder(Integer order) {this.order =order;

}

}

2)、测试类

public static voidmain(String[] args) {

List listA = new ArrayList();

Person p1= newPerson();

Person p2= newPerson();

Person p3= newPerson();

p1.setName("name1");

p1.setOrder(1);

p2.setName("name2");

p2.setOrder(2);

p3.setName("name3");

p3.setOrder(3);

listA.add(p2);

listA.add(p1);

listA.add(p3);//直接在这里添加我们的排序规则

Collections.sort(listA, new Comparator() {public intcompare(Person arg0, Person arg1) {returnarg0.getOrder().compareTo(arg1.getOrder());

}

});for(Person p : listA) {

System.out.println(p.getName());

}

}

从上面看到,直接在Conllections.sort()方法中重写了一个Comparator接口,可以在不同的地方使用Person集合的不同排序方法。如上面还是按照Person的order属性升序排列,我只要改写该方法,就可以在其他地方按照其他的规则对我的list集合进行排序,但是这样子代码看起来会比前面的那种方式繁琐。

3)、结果

name1

name2

name3

致谢:感谢您的阅读!

4.扩展:按照两个字段排序

比如先按照名字排序,如果名字相同,按照小名排序;例子如下:

packagecom.cy.model;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;public class Student implements Comparable{private intid;private String name; //名字

private String sname; //小名

public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getSname() {returnsname;

}public voidsetSname(String sname) {this.sname =sname;

}public Student(intid, String name, String sname) {super();this.id =id;this.name =name;this.sname =sname;

}

@OverridepublicString toString() {return "Student [id=" + id + ", name=" + name + ", sname=" +sname+ "]";

}/*** student类的排序方法

* 先按照name排序,如果name相同按照sname排序*/@Overridepublic intcompareTo(Student o) {int r1 = this.getName().compareToIgnoreCase(o.getName());int r2 = this.getSname().compareToIgnoreCase(o.getSname());return r1>0?1:

r1<0?-1:

r2>0?1:

r2<0?-1:0;

}//测试程序

public static voidmain(String[] args) {

Student s1= new Student(2,"zhangsan","z");

Student s2= new Student(1, "zhangsan","b");

Student s3= new Student(3, "zhangsan","y");

Student s4= new Student(0, "lisi","s");

Student s5= new Student(5, "wangwu","w");

Student s6= new Student(10, "wangwu","xx");

Student s7= new Student(8, "aming","ming");

List list = new ArrayList();

list.add(s1);list.add(s2);list.add(s3);list.add(s4);

list.add(s5);list.add(s6);list.add(s7);

Collections.sort(list);for(Student s : list){

System.out.println(s);

}

}

}

打印:

Student [id=8, name=aming, sname=ming]

Student [id=0, name=lisi, sname=s]

Student [id=5, name=wangwu, sname=w]

Student [id=10, name=wangwu, sname=xx]

Student [id=1, name=zhangsan, sname=b]

Student [id=3, name=zhangsan, sname=y]

Student [id=2, name=zhangsan, sname=z]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值