使用toString方法对Java集合排序无效问题求助
问题原因及解决方案
核心原因
你排序的是people.toArray()生成的新数组,而非原ArrayList集合本身。toArray()方法会返回一个包含集合元素的独立数组,对这个数组排序只会改变数组内的元素顺序,原集合people的元素排列完全不受影响,所以你看到排序前后集合顺序没有变化。你当前看到的顺序其实是集合元素的初始添加顺序,和排序操作无关。
正确解决方法
方法1:直接调用ArrayList的sort方法
直接操作原集合,调用其自带的sort方法,会直接修改集合内的元素顺序:
people.sort(Comparator.comparing(Person::toString));
方法2:使用Collections工具类排序
借助Collections工具类的静态方法完成排序:
Collections.sort(people, Comparator.comparing(Person::toString));
方法3:数组中转后替换原集合(不推荐)
如果一定要通过数组排序中转,需要将排序后的数组重新转为集合替换原对象:
Person[] personArray = people.toArray(new Person[0]); Arrays.sort(personArray, Comparator.comparing(Person::toString)); people = new ArrayList<>(Arrays.asList(personArray));
额外优化建议
如果Person类的排序逻辑固定(比如先按lastName排序,再按privateName排序),可以让Person实现Comparable<Person>接口,这样排序更规范,无需每次传入Comparator:
class Person implements Comparable<Person> { private String privateName; private String lastName; public Person(String privateName, String lastName) { this.privateName = privateName; this.lastName = lastName; } @Override public String toString() { return privateName + " " + lastName; } @Override public int compareTo(Person o) { // 先比较lastName,再比较privateName int lastNameCompare = this.lastName.compareTo(o.lastName); if (lastNameCompare != 0) { return lastNameCompare; } return this.privateName.compareTo(o.privateName); } }
之后直接调用people.sort(null);或Collections.sort(people);就能实现预期的字典序排序。
内容的提问来源于stack exchange,提问作者user16076953
相关产品推荐
相关产品推荐

