疑问:存储在集合中的数据如何排序?
1)存储在集合中的基本数据类型和字符串类型如何排序?
2)存储在集合中的字符串类型如何排序?
3)自定义的类型,在集合中如何排序?(Comparator接口和Comparable接口,这两个接口中定义了比较器,自定义的类可以依照这个比较器进行排序)
回顾:以前数组排序的排序是:Arrays类的sort()方法
那么集合如何排序?
集合排序是使用Collections类中定义的sort()方法对List集合中的数据进行排序:
1.基本数据类型和字符串数据类型的排序
List中整型数据的排序:Collections类的Sort()方法:
List中String类型数据的排序:Collections类的Sort()方法:
2.自定义数据类型的集合排序:Comparator接口
使用Comparator接口或Comparable接口去定义排序的依据.
Comparator接口:
(1)Comparator接口相当于是一个比较器,其可以强行对集合中自定义数据进行排序;即一个实现了这个接口,并按照自己的逻辑重写了compare()方法的类就是一个可以使用的比较器;
(2)可以将Comparator接口(实际是是实现类这个接口的类的示例对象)作为一个参数传递给sort()方法;
即如果是对集合中的自定义数据排序的话,Comparator接口传递给collections.sort()方法;
如果是对数组中的自定义数据进行排序的话,Comparator接口传递给Arrays.sort()方法;
(3)Comparator接口中有一个 int compare(T o1,T o2)方法:(o1和o2是需要比较的两个对象):
如果o1<o2,返回负整数;
如果o1==o2,返回0;
如果o1>o2,返回正整数;返回值是排序的依据。
(4)Comparator接口中有一个 boolean equals(Object obj) 方法:
这个是继承自Object的equals(),即被Object类中的equals()方法覆盖了,不必要重写,即不用管它。
(5)java.util包下的接口。
……………………………………………………
如下示例:集合中存储Cat类对象,按名字升序,或者,按年龄降序:
Cat类:集合中存储对象的类型;
NameComparator类:实现Comparator接口并实现其int compare(T o1,T o2)方法,从而作为一个比较器;
CatTest类:测试类;
/*******************
注:
其排序最终还是调用Collections.sort()方法,只不过调用的是,sort()方法的另一个有两个参数的重载形式而已。
***********************************/
/**
* Cat类,集合中存储对象的类型
* @author Administrator
*
*/
public class Cat {
private String name;
private int month;
private String species;
public Cat(){}
public Cat(String name,int month,String species){
this.name= name;
this.month = month;
this.species = species;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
@Override
public String toString(){
return "名字:"+ name+"年龄:"+month+"品种:"+species;
}
}
这儿因为业务需求,需要比较字符串,所有用到了String类中的compareTo()方法
/**
* NameComparator类实现了Comparator接口,并根据业务逻辑要求,实现了接口中的compare方法。
* 该类可以作为一个比较器,后面其作为Collection.sort()方法的一个参数,影响排序策略和结果
* @author Administrator
*
*/
public class NameComparator implements Comparator<Cat> {
@Override
public int compare(Cat arg0, Cat arg1) {
String name1 = arg0.getName();
String name2 = arg1.getName();
// int compareTo(String str)方法:如果name1<name2,返回负整数;如果相等返回0;否则返回正整数。
// 正好compareTo()方法的返回值逻辑和Comparator接口的compare()方法(即本方法)的逻辑是一样的;
// 所以本compare()方法直接返回n即可了
int n = name1.compareTo(name2);
// 很显然,如果向按名字倒叙排列的话,只需要将上改成:int n = name2.compareTo(name1);即可
return n;
}
}
public class CatTest {
public static void main(String[] args) {
Cat cat1 = new Cat("huahua",5,"短毛猫");
Cat cat2 = new Cat("fanfan",2,"田园猫");
Cat cat3 = new Cat("maomao",3,"小黑猫");
ArrayList<Cat> list = new ArrayList<Cat>();
list.add(cat1);
list.add(cat2);
list.add(cat3);
System.out.print("排序前: ");
for(Cat cat:list){
System.out.print(cat+"******");
}
System.out.println();
// 把实现了Comparator接口的类的对象作为参数传入,作为集合的比较器
Collections.sort(list, new NameComparator()); // Collections方法中sort()方法的重载
System.out.print("排序后来: ");
for(Cat cat:list){
System.out.print(cat+"******");
}
}
}
……………………………………………………
按年龄降序排列:比较器AgeComperator类
/**
* NameComparator类实现了Comparator接口,并根据业务逻辑要求,实现了接口中的compare方法。
* 该类可以作为一个比较器,后面其作为Collection.sort()方法的一个参数,影响排序策略和结果.
* 按年龄降序排序
* @author Administrator
*
*/
public class AgeComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
int age1 = o1.getMonth();
int age2= o2.getMonth();
// 按年龄进行降序排序
return age2-age1;
// return age1-age2;这是升序。这而的返回值,只要符合逻辑即可。
}
}
然后将CatTest类中的Collections.sort(list, new NameComparator());改为Collections.sort(list, new AgeComparator());即可,即修改下比较器即可。
public class CatTest {
public static void main(String[] args) {
Cat cat1 = new Cat("huahua",5,"短毛猫");
Cat cat2 = new Cat("fanfan",2,"田园猫");
Cat cat3 = new Cat("maomao",3,"小黑猫");
ArrayList<Cat> list = new ArrayList<Cat>();
list.add(cat1);
list.add(cat2);
list.add(cat3);
System.out.print("排序前: ");
for(Cat cat:list){
System.out.print(cat+"******");
}
System.out.println();
// 把实现了Comparator接口的类的对象作为参数传入,作为集合的比较器
Collections.sort(list, new AgeComparator()); // Collections方法中sort()方法的重载
System.out.print("排序后来: ");
for(Cat cat:list){
System.out.print(cat+"******");
}
}
}