1

これらの文字列を文字列の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「選択」が壊れていないを参照)。

あなたの文字列はそのようにソートされるべきではありません、そしてこれまでのところ何人かの人々はそれらがそうではないことを確認しました。では、何があなたをそのように分類させているのでしょうか?

  • 習慣Comparatorをに渡しましたsort()か?
  • 文字列は本当にあなたが示したのとまったく同じですか?空白文字はすべてスペースですか?

この結果を生成する正確なコードを投稿できますか?

于 2009-06-05T13:11:55.703 に答える
2

10と11で終わる2つには、空白のスペースではなくタブが含まれている可能性があります。タブはスペースの前にソートされます。

更新:私は実際にこれを試しましたが、タブのあるものは注文の一番上に並べ替えられます。これは理にかなっています。したがって、タブ理論は実際に観察された動作を説明していません。

于 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)。シーケンスは、上記の各行の最後の 3 文字です。

要約すれば、

  1. 最後の文字が ... 7 8 9 1(0) 1(1) のときに文字列を並べ替えます。
  2. (並べ替えを行った後) 007、008、009、010、011 の形式で記述します。
于 2009-06-05T14:19:30.577 に答える