1.List排序
List集合中的元素的特点,有序可重复。如果想以特定方式排序,需要通过以下几种方式:使用list的sort方法、使用Collections中的sort方法。
1.使用list的sort方法
package myblog.javabasis.collection.Collection.List;
//新建一个Student类并重写toString方法
public class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
}
}
//正常输出结果如下
//Student{id=1, name='Tom', age=12}
//Student{id=2, name='Jerry', age=9}
//Student{id=3, name='Snoopy', age=15}
使用sort方法过程如下:
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1,"Tom",12));
studentList.add(new Student(2,"Jerry",9));
studentList.add(new Student(3,"Snoopy",15));
studentList.sort(new StudentCompatator());
for (Student student : studentList) {
System.out.println(student);
}
}
//输出如下
//Student{id=2, name='Jerry', age=9}
//Student{id=1, name='Tom', age=12}
//Student{id=3, name='Snoopy', age=15}
2.使用Collections.sort()方法
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1,"Tom",12));
studentList.add(new Student(2,"Jerry",9));
studentList.add(new Student(3,"Snoopy",15));
//studentList.sort(new StudentCompatator());
Collections.sort(studentList,new StudentCompatator());
for (Student student : studentList) {
System.out.println(student);
}
}
//输出如下
//Student{id=2, name='Jerry', age=9}
//Student{id=1, name='Tom', age=12}
//Student{id=3, name='Snoopy', age=15}
2.TreeMap
TreeMap特点:
- 在JDK1.8版本中,TreeMap继承了NavigableMap接口,而NavigableMap接口继承了SortedMap;
- TreeMap中的元素无序不可重复,但是存进去的元素可以按照大小自动排序(通过key值);
- TreeMap实现自定义排序可以通过两种方法,实现Comparable接口、单独写一个比较器Comparator。
在图中可见,默认情况下,TreeMap中的元素是根据key值来进行排序的。
如果TreeMap中的key为引用类型,要使TreeMap中的元素按照key中的元素排序,需要通过以下两种方式。
1.实现TreeMap中添加的value类型需要实现Compara接口:
package myblog.javabasis.collection.Map.TreeMap;
public class Person implements Comparable<Person>{//实现Comparable接口,使用泛型
private int id;
private String name;
private int age;
private String gender;
public Person(int id, String name, int age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age +
", gender='" + gender + '\'' + '}';
}
@Override
public int compareTo(Person person) {
return this.age - person.age;//实现Comparable接口,通过年龄进行比较,排序。
}
}
Map<Person,Integer> personMap = new TreeMap<>();
personMap.put(new Person(1,"Tom",12,"男"),1);
personMap.put(new Person(2,"Jerry",9,"男"),2);
personMap.put(new Person(3,"Snoopy",15,"男"),3);
Set<Map.Entry<Person, Integer>> entrySet = personMap.entrySet();
Iterator<Map.Entry<Person, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()){
System.out.println(entryIterator.next());
}
//输出结果如下,按照年龄排序
//Person{id=2, name='Jerry', age=9, gender='男'}=2
//Person{id=1, name='Tom', age=12, gender='男'}=1
//Person{id=3, name='Snoopy', age=15, gender='男'}=3
2.写一个Comparator比较器
package myblog.javabasis.collection.Map.TreeMap;
import java.util.Comparator;
//比较器,根据年龄排序
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
Map<Person,Integer> personMap = new TreeMap<>(new PersonComparator());
personMap.put(new Person(1,"Tom",12,"男"),1);
personMap.put(new Person(2,"Jerry",9,"男"),2);
personMap.put(new Person(3,"Snoopy",15,"男"),3);
Set<Map.Entry<Person, Integer>> entrySet = personMap.entrySet();
Iterator<Map.Entry<Person, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()){
System.out.println(entryIterator.next());
}
//输出结果如下,根据年龄排序
//Person{id=2, name='Jerry', age=9, gender='男'}=2
//Person{id=1, name='Tom', age=12, gender='男'}=1
//Person{id=3, name='Snoopy', age=15, gender='男'}=3