java 自定义数组排序_Java常用接口:Comparator接口实现自定义对象的数组排序

在日常写程序时,或做笔试题时总会遇到自己定义的类或者数据结构,如果把自己定义的类存入List这样的数组中,排序是很麻烦的,比如:

下面定义了一个Person类

class Person{

String name;

int age;

public Person(String name,int age) {

this.name = name;

this.age = age;

}

@Override

public String toString() {

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

}

}

如果我们要对存了很多Person的数组排序的话,首先要确定排序规定,就是按什么排序,比如按照年龄大小,按照名字之类的,如果我们采用常规方法取值在排序然后交换位置时很麻烦的,好在List为我们提供了sort方法,下面是jdk文档

c9b8a737d2eaecf7f043ad32e2b1e102.png

Parameters:

c - the Comparator used to compare list elements. A null value indicates that the elements’ natural ordering should be used

依旧是List的sort方法根据特定的Comparator排序。使用list.sort(c )的形式排序,c就是这个特定的Comparator对象。Comparator就是我们比较的准则。下面看啊可能Comparator类:

@FunctionalInterface

public interface Comparator< T>

A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order. Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don’t have a natural ordering.

这是一个函数式接口,用于比较两个对象,因为是函数式接口,所以我们可以采用Lambda表达式去实现这个接口,如果不知道什么是函数式接口或者有兴趣用Lambda表达式,参考下面这篇博客:Lambda表达式

下面介绍一下如何实现这个接口:

ce3365b6ab49696debc7780bc8465d5b.png

上面是实现接口必须实现的方法,所以我们写一个类实现这个接口,并且实现这个方法:

class PersonSortByAge implements Comparator{

@Override

public int compare(Person o1, Person o2) {

return o1.age-o2.age;

}

}

这个就很好理解

如果返回值等于零:o1=o2

返回值大于零则o1>o2

返回值小于于零则o1

然后就可以在集合中排序了:

public class ComparatorTest {

public static void main(String[] args) {

List personList = new ArrayList();

personList.add(new Person("ace",22));

personList.add(new Person("xb",21));

personList.add(new Person("glm",36));

personList.add(new Person("sxy",20));

personList.sort(new PersonSortByAge());

for(Person p:personList)

System.out.println(p);

}

}

结果如下,按照年龄大小排好了。

c5abe8be3db807bf55a03a25ecef35ad.png

如果想试试别的排序方法,下面我给出例子:

import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

/**

* 项目名:CSDN

* 包名:Compare

* 文件名:ComparatorTest.java

* 创建时间:2019年4月13日

*

* @author:xiatom

* 描述:比较方法——comparator

*

*

**/

class PersonSortByAgeSmall implements Comparator{

@Override

public int compare(Person o1, Person o2) {

return o1.age-o2.age;

}

}

class PersonSortByAgeBig implements Comparator{

@Override

public int compare(Person o1, Person o2) {

return o2.age-o1.age;

}

}

class PersonSortByName implements Comparator{

@Override

public int compare(Person o1, Person o2) {

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

}

}

class Person{

String name;

int age;

public Person(String name,int age) {

this.name = name;

this.age = age;

}

@Override

public String toString() {

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

}

}

public class ComparatorTest {

public static void main(String[] args) {

List personList = new ArrayList();

personList.add(new Person("ace",22));

personList.add(new Person("xb",21));

personList.add(new Person("glm",36));

personList.add(new Person("sxy",20));

System.out.println("按照年龄,大的排前面");

personList.sort(new PersonSortByAgeBig());

for(Person p:personList)

System.out.println(p);

System.out.println();

System.out.println("按照年龄,小的排前面");

personList.sort(new PersonSortByAgeSmall());

for(Person p:personList)

System.out.println(p);

System.out.println();

System.out.println("按照名字排序");

personList.sort(new PersonSortByName());

for(Person p:personList)

System.out.println(p);

}

}

576a8082d9038eb3a7a2de916cd9871c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值