一、集合工具类
java.util.Arrays类:包含对数组的操作方法。如排序,复制,二分搜索等。
java.util.Collections类:包含对集合的操作方法。以下为几种常用的方法:
二、以下是对比较器Comparable接口和Comparator接口的赘述
1.Comparable接口(内部比较器)
众所周知,TreeSet和TreeMap能够对放入的元素自动排序,Collection.sort()方法也能如此。那如果我们向集合中放入一个自定义的Person类的类对象,会怎么样呢?将会报如下的错误。意思是说Perosn类的对象不能被转为Comparable实例对象,显然,TreeSet不知道怎么给你这样的类对象排序。
class com.myz.test.Person cannot be cast to class java.lang.Comparable
那为什么TreeSet等能知道怎么给Integert类型或是String类型排序呢?因为Integer等类型已经实现了Comparable接口并定义好了相应的比较规则。
因此,要想让集合支持排序,就要让其中的元素所在的类实现comparable接口并重写compareTo方法
class Person implements Comparable{
public int age;
public String Name;
public int score;
public Person(int age, String name,int score) {
super();
this.age = age;
this.Name = name;
this.score=score;
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
//如果返回0,则加入新元素的时候,会被认为是相同的元素,想不被舍去则返回一个正数或负数
// if(o.age==this.age) return 1;
return o.age-this.age;//按照年龄降序,this-o为升序,o-this为降序
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet s = new TreeSet();
s.add(new Person(15, "关羽",67));
s.add(new Person(34,"张飞",69));
s.add(new Person(21,"刘备",73));
for(Person p:s) {
System.out.println("age:"+p.age+" name:"+p.Name);//按年龄降序打印
}
}
按年龄降序,如果年龄相同,则按分数升序
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
if(o.age==this.age) {
return this.score-o.score;//分数升序
}
return o.age-this.age;//按照年龄降序,this-o为升序,o-this为降序
}
2.Comparator接口(外部比较器)
那么问题来了,如果放入的是Integer类型(默认是升序排列),而我想要降序排列,怎么办?
显然,修改Integer类源码里的Compareto方法是不可能的,只能通过外部传入一个比较器,让它按新的比较器重新比较。
//自定义一个外部比较器
class IntegerComparator implements Comparator{
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2-o1;
}
}
TreeSet s = new TreeSet(new IntegerComparator());
s.add(10);
s.add(15);
s.add(16);
System.out.println(s);//16,15,10
匿名类对象方式
TreeSet s = new TreeSet(new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2-o2;
}
});
s.add(10);
s.add(15);
s.add(16);
System.out.println(s);//16,15,10
lambda表达式方式
TreeSet s = new TreeSet((o1,o2)->o2-o1);
s.add(15);
s.add(14);
s.add(20);
System.out.println(s);//[20, 15, 14]
List list = Arrays.asList(10,34,36,45);
Collections.sort(list, (o1,o2)->o2-o1);
System.out.println(list);//[45, 36, 34, 10]