1

我在 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
4

5 回答 5

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 和时间戳之间的不同空白元素)?

如果没有,您能否制作一个简短但完整的程序来演示该问题?

于 2009-06-05T13:06:31.627 回答
3

好的,让我们从有效的基本前提开始Collections.sort(请参阅“选择”没有被破坏)。

你的字符串不应该这样排序,到目前为止,有几个人已经确认他们没有。那么是什么导致你的排序如此呢?

  • 你把风俗传给Comparatorsort()
  • 琴弦真的和你展示的一模一样吗?空白字符都是空格吗?

你能发布产生这个结果的确切代码吗?

于 2009-06-05T13:11:55.703 回答
2

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

更新:我实际上尝试了这个和带有标签的那些排序到订单的顶部,这是有道理的。所以标签理论实际上并不能解释观察到的行为。

于 2009-06-05T13:10:45.753 回答
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));        
    }
}
于 2009-06-05T13:15:35.463 回答
0

我发现它为什么会这样。

我在做String.format("%03d", sequence). 其中 sequence 是上面每一行的最后 3 个字符。

总之,

  1. 当最后一个字符为 ... 7 8 9 1(0) 1(1) 时对字符串进行排序。
  2. (完成排序后)以 007、008、009、010、011 的形式写出来。
于 2009-06-05T14:19:30.577 回答