Javaでの2文字のアルファベット順の決定

これを行うより良い方法はありますか?

/* Compares two characters.  
   If ch1 is alphabetically smaller than ch2, return true
   If ch1 is equal to ch2 or is alphabetically greater, return false
*/
public static boolean smallestCharacter(char ch1, char ch2) {
    return Character.parseChar((new String(ch1)).toLowerCase()) < 
                 Character.parseChar((new String(ch2)).toLowerCase())
}

更新:ch1とch2は両方とも英語アルファベットの文字であると仮定できます。似たような質問がありますが、ch2とch2が英語の文字であるとは思えません。@Tedd Hoppの答え​​を読むことをお勧めします。

1
@Markらは、コードに基づいて、大文字小文字を無視する必要がある、つまり B および b を意味します。
追加された 著者 paxdiablo,
@マークは非常に有効な懸案事項です。この質問の目的は、大文字と小文字を区別せずに、英語のアルファベットの2つの文字を比較する方法をあまり分かりにくくする方法を見つけることでした。
追加された 著者 objectivesea,
アルファベット順に何を意味していますか?どのアルファベット?ユーザーがそのアルファベットの一部ではない文字を提供するとどうなりますか?
追加された 著者 Mark Byers,

4 答え

どう?

return Character.toLowerCase(ch1) < Character.toLowerCase(ch2);
11
追加された
@TedHoppあなたは答えとしていくつかの詳細を書いています。
追加された 著者 Kevin Reid,
テッド・ホップはそうです。自分自身をASCII文字だけに限定しない限り、それはそれよりも複雑です。たとえば、文字「Ą」はUnicodeでは0104です。つまり、素朴なソート関数はZ(005A)の後に置くことになります。ナンセンスです - ポーランドの児童全員がAの直後に来ていることを知っています
追加された 著者 Mike Baranczak,
これは、2文字のUnicodeコードポイントがOPの "アルファベット順"という概念に対応する場合には機能します。英語は問題ありませんが、他の多くの言語ではありません。もっと一般的な設定をするには、 Collat​​or を適切なロケールで置き換えます。
追加された 著者 Ted Hopp,
@ケビン - 終わった。提案していただきありがとうございます。
追加された 著者 Ted Hopp,
また、補足文字が正確であるとは限りません。
追加された 著者 viktor,

For English (and many other languages), you can just use Character.toLowerCase as @aleph_null proposes. This compares characters based on their (lower case) Unicode code points. For some languages, however, this will be wrong. (For instance, in German, ß — eszett — comes between 's' and 't'. However, its Unicode value is U+00DF, which would make it come after 'z'.)

2つの文字を比較する唯一の方法は、ロケールを参照することです。これを行う1つの方法は、Collat​​orを使用することです。

/**
 * Compares two characters, ignoring all but primary differences. (Case
 * is a tertiary difference.)
 * @return true if ch1 is alphabetically smaller than ch2; false otherwise
 */
public static boolean smallestCharacter(char ch1, char ch2, Locale locale) {
    Collator collator = Collator.getInstance(locale);
    collator.setStrength(Collator.PRIMARY);//Collator.SECONDARY would work
    return 0 > collator.compare(Character.toString(ch1),
                                Character.toString(ch2)
                               );
}

(P.S.、 new String(ch1)は、指定されたchar値を含むStringオブジェクトを作成する方法ではありません)。

4
追加された

文字ごとにStringオブジェクトを作成しないでください。 単純な Character.toLowerCase(char)を使用すると、 その後、あなたの比較方法は:

public boolean smallestCharacter(char a, char b){
    return Character.toLowerCase(a) < Character.toLowerCase(b)
}
1
追加された

どのように:

public static boolean smallestCharacter(char ch1, char ch2) {
  if (ch1 > 0x60) ch1 -= 0x20;
  if (ch2 > 0x60) ch2 -= 0x20;
  return ch1 < ch2;
}
1
追加された