_077_Java_java类如何按照某一属性排序

转自https://blog.csdn.net/kangaroo_07/article/details/77688358,感谢作者的无私分享。

1. 首先Person类,实现可按照属性name或者age排序,Personl类如下:

class Person{

public String name;

public int age;

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}

2.首先看示例:利用Collections.sort方法实现对String,Integer...等等类型的排序

public class T1 {


public static void main(String[] args) {


List<String> list=new ArrayList<String>();

list.add("d");

list.add("f");

list.add("a");

sortString(list);


System.out.println("===========");


List<Integer> list2=new ArrayList<Integer>();

list2.add(9);

list2.add(5);

list2.add(8);

sortInteger(list2);

}



public static void sortString(List<String> list){

Collections.sort(list);



for (String string : list) {

System.out.println(string);

}

}

public static void sortInteger(List<Integer> list){

Collections.sort(list);



for (Integer integer : list) {

System.out.println(integer);

}

}

}


3.试试对Person类进行排序

public class T2 {


public static void main(String[] args) {


List<Person> list=new ArrayList<Person>();


Person p1=new Person("d",55);

Person p2=new Person("c",18);

Person p3=new Person("a",37);


list.add(p1);

list.add(p2);

list.add(p3);

sortPerson(list);

}


public static void sortPerson(List<Person> list){

Collections.sort(list);//编译不通过!!!!

}

}


编译器提示"The method sort(List<T>) in the type Collections is not applicable for the arguments (List<Person>)"

 

要想使用Collections.sort进行排序 该class 必须实现Comparable<Person>接口,并覆写compareTo方法;现在对Person类进行改造:

class Person implements Comparable<Person>{

public String name;

public int age;


public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

@Override

public int compareTo(Person o) {

return this.getName().compareTo(o.getName());

}

}

再次测试:

public class T2 {



public static void main(String[] args) {



List<Person> list=new ArrayList<Person>();



Person p1=new Person("d",55);

Person p2=new Person("c",18);

Person p3=new Person("a",37);



list.add(p1);

list.add(p2);

list.add(p3);

sortPerson(list);

}



public static void sortPerson(List<Person> list){

Collections.sort(list);//编译通过;

for (Person person : list) {

System.out.println(person);

}

}

}

输出结果:

Person [name=a, age=37]

Person [name=c, age=18]

Person [name=d, age=55]

4.以上代码中实现了按照name属性对List<Person>排序,如果想按照age属性排序,需要修改>compareTo方法 如下:

@Override

public int compareTo(Person o) {

return new Integer(this.getAge()).compareTo(o.getAge());

}


再次运行main方法测试结果如下:

Person [name=c, age=18]

Person [name=a, age=37]

Person [name=d, age=55]

5.其他实现方式(1):Person类可以不实现Comparable<T>接口,而是调用public static <T> void sort(List<T> list, Comparator<? super T> c)方法实现排序。

public static void sortPerson(List<Person> list){

Collections.sort(list,new Comparator<Person>() {

@Override

public int compare(Person o1, Person o2) {

return o1.getName().compareTo (o2.getName());

}

});



for (Person person : list) {

System.out.println(person);

}

}


6.其他实现方式(2):Person类可以不实现Comparable<T>接口,而是通过自定义比较器类的方式实现排序。比较器代码如下:

// 自定义比较器:按name比较

class NameComparator implements Comparator<Person> {



@Override

public int compare(Person o1, Person o2) {

return o1.getName().compareTo(o2.getName());

}

}



// 自定义比较器:按age比较

class AgeComparator implements Comparator<Person> {

public int compare(Person object1, Person object2) {// 实现接口中的方法

return new Integer(object1.getAge()).compareTo(object2.getAge());

}

}

比较器使用方式如下: 

public class T2 {



public static void main(String[] args) {



List<Person> list=new ArrayList<Person>();



Person p1=new Person("d",55);

Person p2=new Person("c",18);

Person p3=new Person("a",37);



list.add(p1);

list.add(p2);

list.add(p3);

sortPerson(list);

}



public static void sortPerson(List<Person> list){



Collections.sort(list,new NameComparator());

for (Person person : list) {

System.out.println(person);

}

}

}
运行结果如下:
Person [name=a, age=37]

Person [name=c, age=18]

Person [name=d, age=55]

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值