0

だから私はJavaの初心者で、質問があった本から解決していました:

選択したテキストの段落を含む文字列変数を設定するプログラムを作成します。テキストから単語を抽出し、アルファベット順に並べ替えます。並べ替えられた単語のリストを表示します。バブルソートと呼ばれる簡単なソート方法を使用できます。配列を昇順にソートするプロセスは次のとおりです。配列の最初の要素から始めて、連続する要素 (0 と 1、1 と 2、2 と 3 など) を比較します。b. 任意のペアの最初の要素が 2 番目の要素より大きい場合は、2 つの要素を交換します。c. インターチェンジが不要になるまで、アレイ全体に対してこのプロセスを繰り返します。配列要素が昇順になりました。

私の解決策は次のとおりでした:

public class bubbleSort {

    public static void main(String[] args) {

        String Homer = "He was the son of Epikaste and Telemachus. " +
                "He was said to be a court singer ";

        String swap;
        Homer = Homer.replace(',', ' ');
        Homer = Homer.replace('.', ' ');
        Homer = Homer.replace("  ", " ");

        String[] words = Homer.split(" ");

        for(String val:words){
            System.out.println(val);
        }

        System.out.println(" ---- SORTED -------");

        boolean exchange = true;
        while (exchange) {
            exchange = false;
            for (int i = 0; i < (words.length - 1); ++i) {
                if (words[i].charAt(0) > words[i + 1].charAt(0)) {

                    swap = words[i];
                    words[i] = words[i + 1];
                    words[i + 1] = swap;
                    exchange = true;
                }
            }
        }

        for(String val:words){
            System.out.println(val);
        }
    }
}

ただし、ソートされた出力は意図したものではありませんでした!

彼はエピカステとテレマコスの息子だった 彼は宮廷歌手であると言われていました ---- SORETED ------- エピカステ 彼はテレマコスであり、息子の宮廷であると言われていました 歌手は

どこで間違いを犯したのですか?ありがとう !

4

3 に答える 3

2

簡単な方法は、すべての単語を大文字または小文字に変換することです。

ただし、Java で言語の単語を比較する正しい方法は、Collator

Collator myCollator = Collator.getInstance(); // optional: pass your locale
if( myCollator.compare("abc", "ABC") < 0 )
    System.out.println("abc is less than ABC");
else
    System.out.println("abc is greater than or equal to ABC");

これにより、「è」や「ä」などの特殊文字を含む単語が正しくソートされます。これはあなたの例には何の違いもありませんが、Java を学習している場合は、最初から学習してください。


あなたの例では、メソッドの先頭にコレーターインスタンスを作成し、置き換えます

if (words[i].charAt(0) > words[i + 1].charAt(0))

if (myCollator.compare(words[i], words[i+1]) > 0)
于 2013-06-26T20:43:31.823 に答える
2

ソートされます 正しいソートを取得するには、ASCII の大文字が小文字よりも小さくなります ソート中にすべての大文字を小文字に、またはその逆に変更します

于 2013-06-26T20:34:16.427 に答える
0

結果で気に入らないのは、小文字の単語の前に大文字の(大文字の)単語をソートしたことだと思います。大文字 a ~ z はコード ポイント 65 ~ 90 を使用するのに対し、小文字 a ~ z はコード ポイント 97 ~ 122 を使用するため、これは驚くべきことではありません。

解決策: 比較のためにすべての単語を小文字に変換します。そのために使用String.toLowerCase()します。

たとえば、元のコードの代わりに

for (int i = 0; i < (words.length - 1); ++i) {
    if (words[i].charAt(0) > words[i + 1].charAt(0)) {

もっと好きにする

for (int i = 0; i < (words.length - 1); ++i) {
    String w = words[i].toLowerCase();
    String w1 = words[i+1].toLowerCase();
    if (w.charAt(0) > w1.charAt(0)) {
于 2013-06-26T20:36:40.187 に答える