当一个集合包含 java 中的字符、整数和字符串时,排序顺序是什么

What is the sorting order when a collection contains character,integer and string in java

当集合中包含字符、整数和字符串时,我对排序偏好有疑问。当它有这种数据时,排序顺序是如何工作的。例如:['a',2,3,5,'b',ab","def"] 以及它将如何对这些数据进行排序以及它将使用什么逻辑对这些数据进行排序。

当你有某些疑问时,你可以随时尝试一下:

尝试 #1:让我们对对象列表进行排序

List<Object> list = Arrays.asList('a',2,3,5,'b',"ab","def");
      
Collections.sort(list);

结果:

error: no suitable method found for sort(List<Object>)
      Collections.sort(list);
                 ^
    method Collections.<T#1>sort(List<T#1>) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: Object
        lower bounds: Comparable<? super T#1>)
    method Collections.<T#2>sort(List<T#2>,Comparator<? super T#2>) is not applicable
      (cannot infer type-variable(s) T#2
        (actual and formal argument lists differ in length))
  where T#1,T#2 are type-variables:
    T#1 extends Comparable<? super T#1> declared in method <T#1>sort(List<T#1>)
    T#2 extends Object declared in method <T#2>sort(List<T#2>,Comparator<? super T#2>)

因此,普通 List<Object> 无法按原样排序。

尝试#2。给定示例中的所有对象都是 Comparable,因此让我们尝试对它们进行排序:

List<Comparable> list = Arrays.asList('a',2,3,5,'b',"ab","def");
      
Collections.sort(list);

也不行:

Exception in thread "main" java.lang.ClassCastException: class java.lang.Character cannot be cast to class java.lang.Integer (java.lang.Character and java.lang.Integer are in module java.base of loader 'bootstrap')
    at java.base/java.lang.Integer.compareTo(Integer.java:59)
    at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    at java.base/java.util.Arrays.sort(Arrays.java:1249)
    at java.base/java.util.Arrays.sort(Arrays.java:1436)
    at java.base/java.util.Arrays$ArrayList.sort(Arrays.java:4405)
    at java.base/java.util.Collections.sort(Collections.java:145)

因此,列表中的对象不应该只是 Comparable,它们的类型必须是“兼容的”

尝试#3。使用Object的一些现有方法来比较对象(例如toStringhashCode

List<Object> list = Arrays.asList('a',2,3,5,'b',"ab","def");
      
list.sort(Comparator.comparingInt(Object::hashCode));

System.out.println("Sorted by hashCode: " + list);
      
list.sort(Comparator.comparing(Object::toString));
      
System.out.println("Sorted by toString: " + list);

输出:

Sorted by hashCode: [2, 3, 5, a, b, ab, def]
Sorted by toString: [2, 3, 5, a, ab, b, def]