List集合排序

对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集合

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值