Javaで定義されている辞書式順序は、特に!
、.
などの特殊文字を参照して)どう定義されますか?
例示的な注文を見つけることができます ここ
しかし、Javaはその順序をどのように定義しますか?JavaおよびOracleで文字列をソートしていて、異なる結果が出て見つからないため、辞書式順序の仕様。
String.compareTo
のドキュメントから:
2つの文字列を辞書式に比較します。比較は、文字列内の各文字のUnicode値に基づいています。
そして
これは、辞書式順序付けの定義です。 2つの文字列が異なる場合、両方の文字列の有効なインデックスであるインデックスに異なる文字が含まれているか、長さが異なるか、またはその両方です。 1つ以上のインデックス位置に異なる文字がある場合、kをそのようなインデックスの最小値とします。次に、<演算子を使用して決定された位置kの文字の値が小さい文字列は、辞書順で他の文字列の前に置かれます。この場合、compareToは2つの文字列の位置kにある2つの文字値の差を返します[...]
したがって、基本的には、各文字列を16ビットの符号なし整数のシーケンスのように扱います。文化的な認識、複合文字などの理解はありません。より複雑な種類のソートが必要な場合は、 Collator
を確認する必要があります。
Javaでは、文字列のUnicode値に基づいています:
http://download.Oracle.com/javase/1.4.2/docs/api/Java/lang/String.html#compareTo(Java.lang.String )
Oracleでは、データベースで使用している文字セットによって異なります。 Javaと一貫した動作をするためには、UTF-8にする必要があります。
文字セットを確認するには:
SQL> SELECT parameter, value FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
PARAMETER VALUE
------------------ ---------------------
NLS_CHARACTERSET UTF8
UTF-8でない場合は、Oracleデータベースが使用している文字セットに応じて、異なる比較動作を行うことができます。
javadocs から:
比較は、文字列内の各文字のUnicode値に基づいています。
より詳細な:
これは、辞書式順序付けの定義です。 2つの文字列が異なる場合、両方の文字列の有効なインデックスであるインデックスに異なる文字が含まれているか、長さが異なるか、またはその両方です。 1つ以上のインデックス位置に異なる文字がある場合、kをそのようなインデックスの最小値とします。次に、<演算子を使用して決定された位置kの文字の値が小さい文字列は、辞書順で他の文字列の前に置かれます。この場合、compareToは、2つの文字列の位置kにある2つの文字値の差を返します...
お役に立てれば!!
スコアの降順に基づいてソートされた従業員。2人の異なる従業員が同じスコアを持っている場合、辞書順でソートするために従業員名を考慮する必要があります。
従業員クラスの実装:(この場合はComparableインターフェースを使用。)
@Override
public int compareTo(Object obj) {
Employee emp = (Employee) obj;
if(emp.getScore() > this.score) return 1;
else if(emp.getScore() < this.score) return -1;
else
return emp.getEmpName().compareToIgnoreCase(this.empName) * -1;
}