<Java>使用Comparable和Comparator自定义排序

文章目录

    • 1、基本类型排序
    • 2、为对象进行排序

对List中的元素进行排序,可以使用List自带的sort()方法,使用时,我们需要向其传入一个实现的Comparator接口

default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

1、基本类型排序

下面为List集合进行升序排序:

public static void main(String[] args) {
    List<Integer> list=new ArrayList();

    list.add(-1);
    list.add(3);
    list.add(3);
    list.add(-5);
    list.add(7);
    list.add(-9);
    list.add(4);

	System.out.println("原始数组:"+list);
	
	list.sort(new Comparator<Integer>(){
		//实现升序排序
		public int compare(Integer i1,Integer i2){
			return i1-i2;
		}	
	});
	
	System.out.println("升序排序后的数组:"+list);
}

如果想要进行降序排序,那么在进行比较时,在return i1-i2这里前面加一个负号就可以了,那么就变成

//实现降序排序
list.sort(new Comparator<Integer>(){
    public int compare(Integer i1,Integer i2){
        return i2-i1;
    }
});

2、为对象进行排序

如果集合中的元素为复杂类型的对象,那么想为其进行排序,需要在创建对象的时候就让其实现Comparable接口

Person

public class Person implements Comparable<Person>{
    private int age;
    private String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int compareTo(Person another){
        //先按照年龄升序
        if(this.age!=another.age){
            return this.age-another.age;
        }else{
            //年龄相同,则按照名字升序
            return this.name.compareTo(another.name);
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

测试:

public static void main(String[] args) {

    List<Person> personList=new ArrayList(10);

    personList.add(new Person(18,"zhangsan"));
    personList.add(new Person(18,"lisi"));
    personList.add(new Person(19,"zhongli"));
    personList.add(new Person(20,"azzz"));
    personList.add(new Person(18,"azhangsan"));

    System.out.println("Person排序前:"+personList);

    personList.sort(new Comparator<Person>(){
        public int compare(Person p1,Person p2){
            return p1.compareTo(p2);
        }
    });

    System.out.println("Person排序后:"+personList);
}

运行结果:

Person排序前:[Person{age=18, name='zhangsan'}, Person{age=18, name='lisi'},
Person{age=19, name='zhongli'}, Person{age=20, name='azzz'},Person{age=18, name='azhangsan'}]

Person排序后:[Person{age=18, name='azhangsan'}, Person{age=18, name='lisi'},
 Person{age=18, name='zhangsan'}, Person{age=19, name='zhongli'}, Person{age=20, name='azzz'}]

排序技巧:
返回负数,则第一个参数放前面

比如

list.sort(new Comparator<Integer>(){
	//实现升序排序
	public int compare(Integer i1,Integer i2){
		return i1-i2;
	}	
});

假如i1

//实现降序排序
list.sort(new Comparator<Integer>(){
    public int compare(Integer i1,Integer i2){
        return i2-i1;
    }
});

假如i2

你可能感兴趣的:(Java,java)