問題は簡単です。 Javaに2つの文字列を比較してアクセント付き文字を無視してtrueを返す関数はありますか?
すなわち
String x = "Joao";
String y = "João";
等しいものを返します。
ありがとう
Collator クラスを使用する必要があると思います。強度とロケールを設定でき、文字を適切に比較します。
Java 1.6 APIから:
Collatorの強度プロパティを設定して、比較で重要と見なされる差異のレベルを決定できます。 PRIMARY、SECONDARY、TERTIARY、IDENTICALの4つの長所が提供されています。言語機能への強さの正確な割り当てはロケールに依存します。たとえば、チェコ語では、「e」と「f」は一次差異と見なされ、「e」と「ě」は二次差異、「e」と「E」は三次差異、「e」と「e」は同一です。
ここで重要な点(人々が作ろうとしていること)は、 "Joao"と "João"が等しいと見なされるべきでは決してないということですが、並べ替えを行う場合、それらをASCII値を使用すると、Joao、John、Joãoのようになり、これは良くありません。 collatorクラスを使用すると、これが正しく処理されます。
あなたは私からこれを聞いていませんでした(私は質問の前提に同意しないため)、しかしあなたはJava.text.Normalizer
、およびNFD
で正規化します。これにより、アタッチされている文字からアクセントが分離されます。次に、アクセント文字をフィルタリングして比較できます。
または、アクセントを無視して比較/ソートしたい場合は、Apache StringUtilsライブラリの stripAccents を使用します。
public int compareStripAccent(String a, String b) {
return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}
区別記号を無視するように設定した場合、Collatorはaとáに対して0を返します。
public boolean isSame(String a, String b) {
Collator insenstiveStringComparator = Collator.getInstance();
insenstiveStringComparator.setStrength(Collator.PRIMARY);
return insenstiveStringComparator.compare(a, b) == 0;
}
isSame( "a"、 "á")はtrueを生成します
public boolean insenstiveStringComparator (String a, String b) {
Java.text.Collator collate = Java.text.Collator.getInstance();
collate.setStrength(Java.text.Collator.PRIMARY);
collate.setDecomposition(Java.text.Collator.CANONICAL_DECOMPOSITION);
return collate.equals(a, b);
}