Java基础-集合篇二

java集合类型的排序:
1、如果需要将TreeSet集合或TreeMap集合内的元素进行排序,有两种实现方式:

第一种:实现Comparable接口。

自定义类型排序:
(像Integer、String等类型都已实现了Comparable接口,不需要程序员手动编写排序规则)

class A implements Comparable《A》{
int age;

public A() {
}

public A(int age) {
    
    this.age = age;
}

@Override
public int compareTo(A o) {
    编写比较规则:
    //this.age-o.age是升序排序。
    //o.age-this.age是降序排序。
    //因为TreeSet底层是二叉树数据结构,按照左小右大的存储数据方式,迭代顺序是左根右
    return this.age-o.age;
}

@Override
public String toString() {
    return "A{" +
            "age=" + age +
            '}';
}

}
小结:放到集合中的自定义类型想要进行排序,首先要实现comparable<>接口,然后重写comparaTo()方法,在comparaTo()方法内编写比较规则。

第二种:创建比较器对象

class AComparator implements Comparator《A》{
public int compare(A o1, A o2) {
			//升序排序
            return o1.age-o2.age;
        }
    });

}

例:Set《A》 set=new TreeSet<>(new AComparator《A》 ());

注意:此种方式需要在创建集合时将比较器传进构造方法!

2、ArrayList集合类型排序的方式:

自定义比较器的方式进行排序

//创建List集合指定泛型为User

  List users=new ArrayList<>();
    users.add(new User(11));
    users.add(new User(1));
    users.add(new User(111));
    users.add(new User(2));

//调用Collections.srot(集合,创建自定义比较器);

    Collections.sort(users,new UserComparator());
    for(User s:users){
        System.out.println(s);
    }
}

}

	//User类
class User{
	int i;
	public User(int i) {
    this.i = i;
}
	@Override
public String toString() {
    return "User{" +
            "i=" + i +
            '}';
}
}

//自定义比较器,实现Comparator接口,并编写比较规则

class UserComparator implements Comparator{
   @Override
public int compare(User o1, User o2) {
//按照年龄升序
    return o1.i-o2.i;
}

}

注意:Collections.srot(); 方法内只能传进List集合进行排序,并且要求需要排序的自定义类型已实现Comparator接口。
ArrayList集合,无法在创建集合时向构造方法内传输比较器。
ArrayList集合内的自定义类型需要排序的话,建议自定义“类”型比较器,实现Comparator接口,后重写compare()方法。

总结:Comparable接口与Comparator接口如何选择?
当比较规则不变时,建议类型实现Comparable接口。(在创建自定义类型上实现该接口)
例:class Student implements Comparable{
//从写ComparaTo()方法
//编写比较规则
}

当比较规则需要不断变换时,建议使用Comparator比较器。(单独编写比较器,泛型为需要排序的自定义类型,或不编写比较器,在集合构造方法上直接创建该比较器,然后编写比较规则。)

				//单独编写比较器后的使用方式
			Collections.sort(list,new  HComparator());

			//	未编写比较器直接创建后编写比较规则的方式
			Collections.sort(list, new Comparator() {
        	@Override
        	public int compare(H o1, H o2) {
        	//升序排序
            return o1.age-o2.age;
        	}
    		});

你可能感兴趣的:(集合排序,集合)