特に などの特殊文字に関して、Java では辞書式の順序はどのように定義され!
て.
いますか?
注文例はこちら
しかし、Java はその順序をどのように定義するのでしょうか? Java と Oracle で文字列をソートしていて、異なる結果が得られ、辞書式順序の仕様が見つからないためです。
特に などの特殊文字に関して、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 人の異なる従業員が同じスコアを持つ場合、辞書順でソートするために従業員名を考慮する必要があります。
Employee クラスの実装: (この場合は 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;
}