Collections.sort出了什么问题?

时间:2009-06-05 13:01:03

标签: java arrays sorting collections arraylist

我在String的ArrayList中没有这些字符串,但是当我调用Collections.sort(listReference)时,排序结果不正确,为什么10和11(最后2个字符)出现在07,08之前, 09?

12880  20090506054200001
12880  20090506054200002
12880  20090513070200003
12880  20090513070200004
12880  20090520202600005
12880  20090520202600006
12880  20090520232900010
12880  20090520232900011
12880  20090520232900007
12880  20090520232900008
12880  20090520232900009

5 个答案:

答案 0 :(得分:9)

它适用于我:

import java.util.*;

public class Test {

      public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("12880  20090506054200001");
        list.add("12880  20090506054200002");
        list.add("12880  20090513070200003");
        list.add("12880  20090513070200004");
        list.add("12880  20090520202600005");
        list.add("12880  20090520202600006");
        list.add("12880  20090520232900010");
        list.add("12880  20090520232900011");
        list.add("12880  20090520232900007");
        list.add("12880  20090520232900008");
        list.add("12880  20090520232900009");

        Collections.sort(list);

        for (String x : list) {
          System.out.println(x);
        }
      }
    }

输出:

12880  20090506054200001
12880  20090506054200002
12880  20090513070200003
12880  20090513070200004
12880  20090520202600005
12880  20090520202600006
12880  20090520232900007
12880  20090520232900008
12880  20090520232900009
12880  20090520232900010
12880  20090520232900011

你绝对确定你的7/8/9条目在其他地方没有“奇怪”的东西(例如12880和时间戳之间的空格的不同元素)?

如果没有,你能否制作一个简短但完整的程序来证明这个问题?

答案 1 :(得分:3)

好的,让我们从Collections.sort的基本前提开始(参见"select" isn't broken)。

你的字符串不应该那样排序,到目前为止,有几个人已经证实他们不这样做。那么是什么原因可能导致你的那样呢?

  • 您是否已将自定义Comparator传递给sort()
  • 这些字符串是否与您展示的完全一致?空白字符是否都是空格?

您可以发布产生此结果的确切代码吗?

答案 2 :(得分:2)

以10和11结尾的两个可能有空格而不是空格的空格。标签在空格之前排序。

更新:我实际尝试了这个,并且带有选项卡的选项排在订单的顶部,这是有道理的。因此,制表理论并没有真正解释观察到的行为。

答案 3 :(得分:1)

这个单元测试工作正常吗?

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

public class SortTest {

    List<String> expectedList = Arrays.asList(
            "12880  20090506054200001",
            "12880  20090506054200002",
            "12880  20090513070200003",
            "12880  20090513070200004",
            "12880  20090520202600005",
            "12880  20090520202600006",
            "12880  20090520232900007",
            "12880  20090520232900008",
            "12880  20090520232900009",
            "12880  20090520232900010",
            "12880  20090520232900011");

    @Test
    public void testSort() {
        List<String> stringList = new ArrayList(expectedList);
        Collections.shuffle(stringList);
        // comment following line out, for the rare case that shuffle returns the original list
        // assertFalse(stringList.equals(expectedList));
        Collections.sort(stringList);
        assertTrue(stringList.equals(expectedList));        
    }
}

答案 4 :(得分:0)

我发现了为什么它的表现如此。

我在执行String.format("%03d", sequence)之前对集合进行了排序。其中sequence是上面每行的最后3个字符。

总之,

  1. 在最后一个字符为...时排序字符串... 7 8 9 1(0)1(1)。
  2. (进行排序后)以007,008,009,010,011的形式书写。