1.内部比较器,自定义实体类实现Comparable接口
/**
* @author Nyotengu
* @date 18/7/26 15:39
*/
public class SortTest {
/**
* 1.内部比较器
* 适用于自定义的实体类
*/
@Test
public void sortWithOuterComparator() {
ArrayList<PersonNoComparator> list = new ArrayList<>();
list.add(new PersonNoComparator("Nyotengu", 1000));
list.add(new PersonNoComparator("Honoka", 16));
list.add(new PersonNoComparator("MarieRose", 16));
list.add(new PersonNoComparator("Momiji", 20));
list.add(new PersonNoComparator("Kasumi", 20));
list.add(new PersonNoComparator("Helena", 25));
// ArrayList中有sort方法,如果使用的集合没有sort方法,直接使用Collections工具类的sort方法,如:
// Collections.sort(list, new MyComparator());
list.sort(new MyComparator());
for (PersonNoComparator person : list) {
System.out.println(person);
}
/* 结果如下:
* PersonNoComparator{name='Honoka', age=16}
* PersonNoComparator{name='MarieRose', age=16}
* PersonNoComparator{name='Kasumi', age=20}
* PersonNoComparator{name='Momiji', age=20}
* PersonNoComparator{name='Helena', age=25}
* PersonNoComparator{name='Nyotengu', age=1000}
*/
}
}
public class PersonImplementsComparable implements Comparable<PersonImplementsComparable> {
private String name;
private int age;
/**
* compareTo 方法使用二叉树排序方法,
* 例如:中序遍历,首先遍历左(右)子树,再访问根,最后遍历右(左)子树:
* 返回值 > 0,排在后面
* 返回值 < 0,排在前面
* 返回值 = 0,舍弃该数值
*
* 例如(6,3,6,8,2,9)排序后为:
* 6(root)
* 3 8
*(left) 2 9 (right)
* @param o
* @return int
*/
@Override
public int compareTo(PersonImplementsComparable o) {
int result = this.age - o.age;
if (result == 0)
// 如果年龄相同,按照姓名从小到大排序
return this.name.compareToIgnoreCase(o.name);
// 按照年龄从小到大排序
return result;
}
public PersonImplementsComparable(String name, int age) {
this.name = name;
this.age = age;
}
public PersonImplementsComparable() {
}
@Override
public String toString() {
return "PersonWithComparator{" + "name='" + name + '\'' + ", age=" + age + '}';
}
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;
}
}
2.外部比较器,自定义比较器类实现Comparator接口
public class SortTest {
/**
* 2.内部比较器
* 适用于自定义的实体类
*/
@Test
public void sortWirthInnerComparator() {
// treeset集合会自动排序
TreeSet<PersonImplementsComparable> set = new TreeSet<PersonImplementsComparable>();
set.add(new PersonImplementsComparable("Nyotengu", 1000));
set.add(new PersonImplementsComparable("Honoka", 16));
set.add(new PersonImplementsComparable("MarieRose", 16));
set.add(new PersonImplementsComparable("Momiji", 20));
set.add(new PersonImplementsComparable("Kasumi", 20));
set.add(new PersonImplementsComparable("Helena", 25));
for (PersonImplementsComparable person : set) {
System.out.println(person);
}
/* 输出结果如下:
* PersonWithComparator{name='Honoka', age=16}
* PersonWithComparator{name='MarieRose', age=16}
* PersonWithComparator{name='Kasumi', age=20}
* PersonWithComparator{name='Momiji', age=20}
* PersonWithComparator{name='Helena', age=25}
* PersonWithComparator{name='Nyotengu', age=1000}
*/
}
}
public class MyComparator implements Comparator<PersonNoComparator> {
@Override
public int compare(PersonNoComparator o1, PersonNoComparator o2) {
int result = o1.getAge() - o2.getAge();
if (result == 0)
// 如果年龄相同,按姓名从小到大排序 使用String类的compare to方法
return o1.getName().compareToIgnoreCase(o2.getName());
// 按年龄从小到大排序
return result;
}
}
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "PersonNoComparator{" + "name='" + name + '\'' + ", age=" + age + '}';
}
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 Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
}