关于java排序的一个小问题


TreeSet<String> set = new TreeSet<>();
        set.add("1");
        set.add("1-1");
        set.add("1-2");
        set.add("1-2-2");
        set.add("1-10-1");
        set.add("1-2-3");
        set.add("3-2");
        set.add("3-1");
        set.add("1-1-2");
        set.add("2-1");
        set.add("2");
        set.add("3");
        set.add("2-1-1");
        set.add("2-2");
        System.out.println(set);

结果为:[1, 1-1, 1-1-2, 1-10-1, 1-2, 1-2-2, 1-2-3, 2, 2-1, 2-1-1, 2-2, 3, 3-1, 3-2]
那种好的写法可以将结果输出为:[1, 1-1, 1-1-2, 1-2, 1-2-2, 1-2-3, 1-10-1, 2, 2-1, 2-1-1, 2-2, 3, 3-1, 3-2]
可就是将 1-10-1 改变至 1-2-3 的后面?

  public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

1、首先你的容器的泛型是String,而且容器是TreeSet,他有序的容器。
2、既然泛型是String,那么在调用add方法的时候会调用String.class的compareTo方法,即上面的代码。
3、重点在int lim = Math.min(len1, len2);这段代码,1-1的长度是3,1-10-1的长度是6,取最小值是3.接下来while会比较3次。

img

4、看上图,循环到红线的地方就结束了。即没法比较1-1和1-10-1的顺序了。

不知道你看懂了没。