回答:
大文字と小文字を区別しないのは、オブジェクト(*)ではなく、比較のプロパティです。大文字小文字を区別せずに、またはコンテキストに関係なく、同じ文字列を比較する必要があります。
(そして、大文字と小文字を区別しない比較は言語に依存するので、あなたはすべての種類のワームを持っています-私はトルコ語ではasとして大文字です-そして文脈-単語と方言によってはßは大文字として大文字にすることができますSSまたはSZ(ドイツ語)。)
(*)文字列を含むオブジェクトのプロパティにすることもできますが、文字列自体のプロパティとは多少異なります。また、文字列以外の状態がないクラスを作成することもできます。そのクラスの2つのインスタンスを比較すると、大文字と小文字を区別しない文字列の比較が使用されます。しかし、そのクラスは、汎用文字列に期待されるメソッドを提供せず、そうでないメソッドを提供するため、汎用文字列にはなりません。このクラスはCaseInsensitiveStringではなく、PascalIdentifierまたはそれを記述するのに適切なものと呼ばれます。ところで、大文字と小文字を区別しない比較アルゴリズムは、おそらくその目的によって提供され、ロケールに依存しません。
TreeSet<String>
使用することをお勧めString.CASE_INSENSITIVE_ORDER
しHashSet<CaseInsensitiveString>
ますか?使用していることを注意TreeSet
する手段をO(log n)
ためcontains
。また、このコンパレータは、一貫性のないとequals
結果として得があることを意味し、TreeSet
一般的に従わないSet
(すなわち、それは5月の契約をcontains(x)
それは何の要素がないにもかかわらず、equals
にをx
)。
equals()
各オブジェクトの実装を使用します。デフォルトの実装があり、どのオブジェクトでもオーバーライドできます。私はあなたがハッシュを定義できるとは思いませんが、それから私は試したことはありません-テーブルはそれを心配することなく常にうまくいきました(C ++ではなくJavaが好きな理由の1つです:))。
私の頭の真上から:
長所:
bool UserIsRegistered(CaseInsensitiveString Username)
短所:
CaseInsensitiveString
してユーザー名を保存する場合、大文字と小文字を区別しないバックエンド比較を行うのは理にかなっていますが、フロントエンドコードはユーザーの名前を「bob smith」または「BOB SMITH」として表示しますCaseInsensitiveStringは、Stringと一緒に機能することを期待していない限り、使用方法に依存する悪い考えではありません。
CaseInsensitiveStringをStringに、またはその逆に変換することができます。
次のようなことをしようとすると問題が発生します
class CaseInsensitiveString {
private String value;
public boolean equals(Object o) {
// .....
if (o instanceof String) {
return value.equalsIgnoreCase((String) o);
}
}
}
equals()(および他のコントラクト)の対称性と推移性に違反するため、CaseInsensitiveStringを通常の文字列で企業化しようとすると、失敗する運命にあります。
ただし、String.CASE_INSENSITIVE_ORDERを使用するのに適さないこのCaseInsensitiveStringが本当に必要な場合は、自問してください。私は多くのケースを賭けません。私はこの特別なクラスを持つ価値があるケースがあると確信していますが、まずあなた自身に尋ねてください。
CaseInsensitiveStringクラスとそのヘルパーは多くのコードを追加し、それらはすべてをString.toLoweCase()メソッドよりも読みにくくします。
CaseInsensitiveString vaName1 = new CaseInsensitiveString('HeLLo');
//... a lot of lines here
CaseInsensitiveString vaName2 = new CaseInsensitiveString('Hello');
//... a lot of lines here
if (varName1.equals(varName2)) ...
よりも複雑で、自己文書化が少なく、柔軟性が低い
String vaName1 = 'HeLLo';
//... a lot of lines here
String vaName2 = 'Hello';
//... a lot of lines here
if (varName1.toLowerCase().equals(varName2.toLowerCase())) ...
Webで最も頻繁に使用される実装では、大文字と小文字が区別されます-XML、JavaScript。パフォーマンスの観点から、常に各ケースに最も適切な関数/プロパティ/オブジェクトを使用することが最善です。
XMLやJSなどの構造を扱う場合は、大文字と小文字を区別することが重要です。システムライブラリを使用すると、はるかに高速になります。
上記のように、データベース内のデータを処理する場合は、データベースのインデックスを使用して、大文字と小文字を区別する/区別しない文字列を作成します。
オンザフライでデータを処理する場合は、文字列ごとに必要な変換コストを計算することが重要です。どういうわけか、文字列を比較またはソートする必要があります。