对List集合排序,需要用到Collection的sort方法
1 对基本数据排序
1.1 正序(单参数)
List<Integer> aaa = new ArrayList<>();
Collections.addAll(aaa, 4, 6, 2, 1, 56, 33);
System.out.println("排序前" + aaa); //排序前[4, 6, 2, 1, 56, 33]
Collections.sort(aaa);
System.out.println("排序后" + aaa); //排序后[1, 2, 4, 6, 33, 56]
1.2 倒叙(双参数)
第二个参数为Comparator匿名内部类,并重写compare方法
o1及其所有属性代表左边,o2及其所有属性代表右边
如果返回值是"左边-右边",表示正序
如果返回值是"右边-左边",表示倒叙
List<Integer> aaa = new ArrayList<>();
Collections.addAll(aaa, 4, 6, 2, 1, 56, 33);
System.out.println("排序前" + aaa); //排序前[4, 6, 2, 1, 56, 33]
Collections.sort(aaa, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
int result = o1 - o2;
return result;
}
});
System.out.println("正序" + aaa); //正序[1, 2, 4, 6, 33, 56]
Collections.sort(aaa, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
int result = o2 - o1;
return result;
}
});
System.out.println("倒叙" + aaa); //倒叙[56, 33, 6, 4, 2, 1]
2 对引用数据排序
对引用数据进行排序,只能用"双参数"形式
List<Person> aaa = new ArrayList<>();
aaa.add(new Person("张三", 22));
aaa.add(new Person("李四", 15));
aaa.add(new Person("王五", 13));
aaa.add(new Person("赵六", 35));
aaa.add(new Person("孙七", 11));
System.out.println("排序前" + aaa);
//排序前[Person{name='张三', age=22}, Person{name='李四', age=15}, Person{name='王五', age=13}, Person{name='赵六', age=35}, Person{name='孙七', age=11}]
Collections.sort(aaa, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result = o1.getAge() - o2.getAge();
return result;
}
});
System.out.println("正序" + aaa);
//正序[Person{name='孙七', age=11}, Person{name='王五', age=13}, Person{name='李四', age=15}, Person{name='张三', age=22}, Person{name='赵六', age=35}]
Collections.sort(aaa, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result = o2.getAge() - o1.getAge();
return result;
}
});
System.out.println("倒叙" + aaa);
//倒叙[Person{name='赵六', age=35}, Person{name='张三', age=22}, Person{name='李四', age=15}, Person{name='王五', age=13}, Person{name='孙七', age=11}]
3 复杂场景应用
按名字由短到长排序,名字长度相同就按年龄由大到小排序:
List<Person> aaa = new ArrayList<>();
aaa.add(new Person("诸葛亮", 22));
aaa.add(new Person("孙悟空", 15));
aaa.add(new Person("刘备", 13));
aaa.add(new Person("爱因斯坦", 35));
aaa.add(new Person("坤", 6));
aaa.add(new Person("张飞", 35));
aaa.add(new Person("关羽", 11));
aaa.add(new Person("亚历山大", 52));
System.out.println("排序前" + aaa);
//排序前[Person{name='诸葛亮', age=22}, Person{name='孙悟空', age=15}, Person{name='刘备', age=13}, Person{name='爱因斯坦', age=35}, Person{name='坤', age=6}, Person{name='张飞', age=35}, Person{name='关羽', age=11}, Person{name='亚历山大', age=52}]
Collections.sort(aaa, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result1 = o1.getName().length() - o2.getName().length();
int result2 = o2.getAge() - o1.getAge();
return result1 == 0 ? result2 : result1;
}
});
System.out.println("排序后" + aaa);
//排序后
// [Person{name='坤', age=6},
// Person{name='张飞', age=35}, Person{name='刘备', age=13}, Person{name='关羽', age=11},
// Person{name='诸葛亮', age=22}, Person{name='孙悟空', age=15},
// Person{name='亚历山大', age=52}, Person{name='爱因斯坦', age=35}]
按name进行分类,再按年龄从小到大排列,最后再合并age:
List<Person> aaa = new ArrayList<>();
aaa.add(new Person("张飞", 1));
aaa.add(new Person("关羽", 3));
aaa.add(new Person("刘备", 4));
aaa.add(new Person("关羽", 5));
aaa.add(new Person("关羽", 2));
aaa.add(new Person("赵云", 7));
aaa.add(new Person("刘备", 3));
aaa.add(new Person("张飞", 5));
aaa.add(new Person("华佗", 8));
aaa.add(new Person("张飞", 2));
System.out.println("排序前" + aaa);
//排序前[Person{name='张飞', age=1}, Person{name='关羽', age=3}, Person{name='刘备', age=4}, Person{name='关羽', age=5}, Person{name='关羽', age=2}, Person{name='赵云', age=7}, Person{name='刘备', age=3}, Person{name='张飞', age=5}, Person{name='张飞', age=2}, Person{name='华佗', age=8}]
Collections.sort(aaa, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result1 = o1.getName().charAt(0) - o2.getName().charAt(0);
int result2 = o1.getAge() - o2.getAge();
return result1 == 0 ? result2 : result1;
}
});
System.out.println("排序后" + aaa);
//排序后
// [Person{name='关羽', age=2}, Person{name='关羽', age=3}, Person{name='关羽', age=5},
// Person{name='刘备', age=3}, Person{name='刘备', age=4},
// Person{name='华佗', age=8},
// Person{name='张飞', age=1}, Person{name='张飞', age=2}, Person{name='张飞', age=5},
// Person{name='赵云', age=7}]
List<Person> bbb = new ArrayList<>();
bbb.add(aaa.get(0));
for (int i = 1; i < aaa.size(); i++) {
if (Objects.equals(aaa.get(i).getName(), aaa.get(i - 1).getName())) {
Person person = bbb.get(bbb.size() - 1);
person.setAge(person.getAge() + aaa.get(i).getAge());
} else {
bbb.add(aaa.get(i));
}
}
System.out.println("合并age后" + bbb);
//合并age后
// [Person{name='关羽', age=10},
// Person{name='刘备', age=7},
// Person{name='华佗', age=8},
// Person{name='张飞', age=8},
// Person{name='赵云', age=7}]
4 Collections常用方法
Collections.addAll(list,element1,element2...) //一次性向list集合添加元素
Collections.shuffle(list) //打乱list集合