71

を使用して文字列の配列をソートしようとしていますcompareTo()。これは私のコードです:

static String Array[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
String temp;

public static void main(String[] args)
{

   for (int j=0; j<Array.length;j++)
   {
       for (int i=j+1 ; i<Array.length; i++)
       {
           if (Array[i].compareTo(Array[j])<0)
           {
               String temp = Array[j];
               Array[j] = Array[i];
               Array[i] = temp;
           }
       }
       System.out.print(Array[j]);
   }
}

出力は次のようになります。

Hello  This Example Sorting is

結果を取得していますが、取得したい結果ではありません。

Hello This Example Is Sorting

文字列配列を正しくソートするようにコードを調整するにはどうすればよいですか?

4

8 に答える 8

146

あなたの出力は正しいです。先頭に「Hello」と「This」の白い文字を付けます。

別の問題は、あなたの方法論にあります。Arrays.sort()次の方法を使用します。

String[] strings = { " Hello ", " This ", "Is ", "Sorting ", "Example" };
Arrays.sort(strings);

出力:

 Hello
 This
Example
Is
Sorting

ここで、配列 "is" の 3 番目の要素は "Is" である必要があります。そうしないと、並べ替え後に最後になります。sort メソッドは内部的に ASCII 値を使用して要素をソートするためです。

于 2012-10-20T07:43:26.920 に答える
15

ここに投稿された代替ソリューション (正しいもの) を除いて、コードの問題点に対処して実際に質問に答えた人は誰もいません。

選択ソートアルゴリズムを実装しようとしていたようです。ここでは並べ替えの仕組みの詳細については説明しませんが、参考のためにいくつかのリンクを含めておきます =)

あなたのコードは構文的には正しいのですが、論理的に間違っています。各文字列をその後の文字列と比較するだけで、部分的に文字列を並べ替えていました。これが修正されたバージョンです(何が「間違っている」かを説明するために元のコードを可能な限り保持しました):

static  String Array[]={" Hello " , " This " , "is ", "Sorting ", "Example"};
String  temp;

//Keeps track of the smallest string's index
int  shortestStringIndex; 

public static void main(String[] args)  
{              

 //I reduced the upper bound from Array.length to (Array.length - 1)
 for(int j=0; j < Array.length - 1;j++)
 {
     shortestStringIndex = j;

     for (int i=j+1 ; i<Array.length; i++)
     {
         //We keep track of the index to the smallest string
         if(Array[i].trim().compareTo(Array[shortestStringIndex].trim())<0)
         {
             shortestStringIndex = i;  
         }
     }
     //We only swap with the smallest string
     if(shortestStringIndex != j)
     {
         String temp = Array[j];
         Array[j] = Array[shortestStringIndex]; 
         Array[shortestStringIndex] = temp;
     }
 }
}

参考文献

このアプローチの問題は、その漸近的な複雑さがO(n^2)であることです。簡単に言えば、配列のサイズが大きくなる (無限に近づく) と非常に遅くなります。クイックソートなど、データをソートするためのより良い方法について読みたいと思うかもしれません。

于 2013-05-20T20:17:39.317 に答える
9

この行の代わりに

if(Array[i].compareTo(Array[j])<0)

この行を使用してください

if(Array[i].trim().compareTo(Array[j].trim())<0)

そして、あなたは行ってもいいです。現在のコードが機能しない理由は、他のユーザーによって既に説明されています。上記の置き換えは、適用できるいくつかの回避策の 1 つです。

于 2012-10-20T08:07:38.903 に答える
4

" Hello " , " This " , "is ", "Sorting ", "Example"

まず、" Hello "" This "にスペースを指定しました。スペースは Unicode のアルファベット文字よりも値が小さいため、最初に出力されます。(残りの文字はアルファベット順にソートされています)。

現在、Unicode では大文字の値が小文字の値よりも小さいため、「Example」と「Sorting」が出力され、最後"is "に値が最も高いものが表示されます。

于 2013-08-19T17:05:17.073 に答える