Collections类
注意, 是Collections类不是Collection接口
1. Collections常用功能
java.utils.Collections
是集合工具类, 用来对集合进行操作.
常用方法如下 :
public static void shuffle(List <?> list)
: 打乱集合顺序.public static <T> void sort(List<T> list)
: 将集合中元素按照默认规则排序public static <T> void sort(List<T> list, Comparator<? super T> )
:将集合中元素按照指定规则排序.
package drafts.drafts3;
import java.util.ArrayList;
import java.util.Collections;
public class CollectionsTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(100);
list.add(50);
list.add(200);
list.add(300);
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
//sort默认升序排序
Collections.sort(list);
System.out.println(list);
}
}
我们的集合按照默认的自然顺序进行了排序, 如果想要指定顺序那该怎么办呢 ?
2. Comparable接口
如果要按指定顺序排序自定义的类, 我们可以用这个类实现Comparable接口, 然后在类中重写compareTo方法.
@Override
public int compareTo(Student o) {
//根据年龄进行升序排序。
return this.getAge() - o.getAge();
}
this代表本类, 公式:【升序就是我(调用者)减他(参数)】 要根据什么进行排序,就让什么属性相减
//Student类实现Comparable接口
package cn.itcast.demo06_collections;
/*
现在Student实现了Comparable接口,表示Student对象具备了比较的功能。
*/
public class Student implements Comparable<Student> {
private String name;
private int age;
/*
compareTo方法可以比较学生对象谁大谁小。
在调用Collections的sort(List)方法进行排序时,那么系统内部会自动调用compareTo方法比较两个对象谁大谁小。
如果返回值是正数,表示调用者对象大于参数对象。
如果返回值是0,表示两个对象相等。
如果返回值是负数,表示调用者对象小数参数对象。
在compareTo中定义比较规则
公式:【升序就是我(调用者)减他(参数)】
要根据什么进行排序,就让什么属性相减
*/
@Override
public int compareTo(Student o) {
//根据年龄进行升序排序。
return this.getAge() - o.getAge();
}
//get set toString方法.
}
3.Comparator接口
在Collections中有一个方法也叫作sort,这个sort可以进行比较器排序
static void sort(List list, Comparator c)
:参数list表示要排序的集合。参数c表示比较器。如果一个类实现了Comparable接口,就表示这个类的对象具备了比较的功能,那么我们就可以使用sort(List)进行排序。- 如果类没有实现Comparable接口,就表示该类的对象不具备比较的功能,那么就不可以使用sort(List)进行排序如果对象本身不具备比较的功能, 那么我们可以找一个法官,帮这些对象去比较, 这个法官就是比较器。
- 如果通过比较器方式比较了对象并排序,那么这个排序方式就是比较器排序。Comparator是一个接口,这个接口表示比较器,如果要用需要使用实现类,这个实现类需要我们自己创建。小结:
- 如果类实现了Comparable接口,表示该类的对象具备了比较的功能,那么可以使用Collections.sort(List)直接排序,这个就是自然排序
- 如果对象不具备比较的功能,那么我们可以找一个法官帮对象去比较这个法官就是一个比较器。我们可以定义类实现Comparator接口去定义比较器,
- 然后调用Collections.sort(List, Comparator),这个就是比较器排序。
// 构造比较器:
package cn.itcast.demo06_collections;
import java.util.Comparator;
/*
Comparator表示的是比较器,当Rule实现了这个接口,Rule也就变成了比较器。
*/
public class Rule implements Comparator<Person>{
//当使用Collections.sort(List,Comparator)进行比较器排序时,内部会自动调用compare比较两个对象谁大谁小。
//如果compare方法返回值是正数,表示第一个对象大于第二个对象
//如果compare方法返回值是0,表示第一个对象等于第二个对象
//如果compare方法返回值是负数,表示第一个对象小于第二个对象
//排序的公式:【升序就是一减二】,根据什么属性进行排序,那么就让什么属性相减
//重写compare方法
@Override
public int compare(Person o1, Person o2) {
//根据年龄升序排序。
return o1.getAge() - o2.getAge();
}
}
//测试类:
package cn.itcast.demo06_collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*
在Collections中有一个方法也叫作sort,这个sort可以进行比较器排序
static void sort(List list, Comparator c):参数list表示要排序的集合。参数c表示比较器。
如果一个类实现了Comparable接口,就表示这个类的对象具备了比较的功能,那么我们就可以使用sort(List)进行排序。
如果类没有实现Comparable接口,就表示该类的对象不具备比较的功能,那么就不可以使用sort(List)进行排序
如果对象本身不具备比较的功能, 那么我们可以找一个法官,帮这些对象去比较, 这个法官就是比较器。如果通过比较器方式比较了对象并排序,那么
这个排序方式就是比较器排序。
Comparator是一个接口,这个接口表示比较器,如果要用需要使用实现类,这个实现类需要我们自己创建。
*/
public class Demo03CollectionsSort {
public static void main(String[] args) {
//创建集合用来保存Person
List<Person> list = new ArrayList<>();
//添加元素
list.add(new Person("jack", 20));
list.add(new Person("rose", 18));
list.add(new Person("tony", 22));
//对集合中的元素排序
Collections.sort(list, new Rule());
//输出结果
System.out.println(list);
}
}
匿名内部类的形式 :
package drafts.drafts4;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ComparatorTest {
public static void main(String[] args) {
//创建四个学生对象, 储存到集合中
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("rose", 18));
list.add(new Student("jack", 16));
list.add(new Student("abc", 19));
list.add(new Student("ma", 40));
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
for (Student student : list) {
System.out.println(student);
}
}
}