0

文字列型の「title」という1つの属性に基づいて要素のArrayListを並べ替えるコードがあります。コードは次のようにCollat​​orを使用します。

Collator( Collator collator = Collator.getInstance(); ).

タイトルが「@a」のオブジェクトが2つあり、もう1つのオブジェクトのタイトルが「#a」です。

これらのオブジェクトをリストとして渡し、呼び出します

Collections.sort(list,comparator)

これは次のように順序を与えます

"@a" "#a"

ASCII値が「@a」よりも小さいのに「#a」が最後に表示されるのはなぜですか?

4

4 に答える 4

4

コメントの1つに基づいて、コレーターを使用してタイトルを並べ替えています。なぜあなたはあなたの質問でそれを言わなかったのかは私を超えています。

とにかく、コレーターはロケール設定に従って文字列をソートします。辞書式順序ではソートされません。そして、あなたが使用しているコレーターは、正しい順序があなたが観察するものであると見なします。辞書式順序が必要な場合は、コレーターを使用しないでください。

また、コレーターは常にロケールに関連付けられていることに注意してください。Collator.getInstance()メソッドのjavadocは次のように述べています。

現在のデフォルトロケールのコレータを取得します。

于 2012-06-06T11:03:26.393 に答える
2

いいえ、出力は「#a」、「@a」です。それは絶対に正しいです。

于 2012-06-06T10:36:06.163 に答える
1

ASCII値が@より小さいのに、#が最後に表示されるのはなぜですか?

私のクリーンルームの実装:

final List<String> list = Arrays.asList("@a", "#a");
Collections.sort(list);
System.out.println(list);

出力:

[#a、@ a]

このコードは問題を再現しません。

参考:
'#'は0x23
'@'は0x40

すべてが正常に見えます。


編集:あなたのコメントに続く新しいコード「コードはCollat​​orを使用してCollator collator = Collator.getInstance();いますが、どのロケールにも固有ではないために使用されています。」

final List<String> list = Arrays.asList("@a", "#a");
final Collator c = Collator.getInstance();

Collections.sort(list, c);
System.out.println(list);

出力:

[@ a、#a]

これはあなたの問題を再現します。

Collator.getInstance()ASCIIテーブルの並べ替えに使用すると、次のようになります。

-、_ 、、、;、:、!、?、/、。、 `、^、'、"、(、)、[、]、{、}、@、$、*、\、&、#、 %、+、<、=、>、|、0、1、2、3、4、5、6、7、8、9、a、A、b、B、c、C、d、D、e、 E、f、F、g、G、h、H、i、I、j、J、k、K、l、L、m、M、n、N、o、O、p、P、q、Q、 r、R、s、S、t、T、u、U、v、V、w、W、x、X、y、Y、z、Z

これはASCII照合順序とはかなり異なることがわかります。

"、#、$、%、&、'、(、)、*、+ 、、、-、。、/、0、1、2、3、4、5、6、7、8、9、:、 ;、<、=、>、?、@、A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、 T、U、V、W、X、Y、Z、[、\、]、^、_、 `、a、b、c、d、e、f、g、h、i、j、k、l、 m、n、o、p、q、r、s、t、u、v、w、x、y、z、{、|、}

OPの利益のために、これはこの出力を作成するために使用されるコードです。

final List<String> list = new ArrayList<String>();
final Collator col = Collator.getInstance();

for (char c = '!'; c < '~'; c++)
{
  list.add(c+"");
}

Collections.sort(list, col);
System.out.println(list);
于 2012-06-06T10:38:38.807 に答える
0

順序を通常とは異なるものにしたい場合は、通常、コンパレータを提供します。

List<String> words = new ArrayList<>();
words.add("#a");
words.add("@a");
Collections.sort(words);
System.out.println("Natural order: " + words);

Collections.sort(words, Collections.reverseOrder());
System.out.println("Reverse natural order: " + words);

プリント

Natural order: [#a, @a]
Reverse natural order: [@a, #a]

したがって、順序がASCIIの逆である場合、それは、コンパレータで順序として定義したものであるためです(これを行ったことを認識しているかどうかに関係なく)

于 2012-06-06T10:42:50.660 に答える