2017-09-06 8 views
1

まず、配列以外のものをどこで使うかを並べ替えるより良い方法があることを知っています。これは、ユーザーが文字列を配列に格納し、削除し、表示し、並べ替えることができるクラスの割り当てです。私はここからどこに行くのかが完全に失われています。バブルソートを使用しようとしていて、配列内の最初のエントリがソートされない場合を除いて、すべてが機能します。 null値をフィルタリングすることでヌルポインタ例外を回避しています。なぜなら、私のif文が長すぎるからです。Java- compareTo()メソッドを使用して文字列配列を手動でソート

private void sortItems(String[] cargohold) { 
    String temp; 
    for (int i = 0; i < cargohold.length - 1; i++) { 
     for (int j = 1; j < cargohold.length; j++) { 
      if (cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) { 
       temp = cargohold[j]; 
       cargohold[j] = cargohold[i]; 
       cargohold[i] = temp; 
      } 
     } 
    } 
} 

私はこれを行うためのさまざまな方法の束を試してみましたが、私はこれが動作しない理由何らかの正当な理由を見つけることができません。 Stack Overflowで見つけられるものはすべて例を通して見てきましたが、誰も同じ問題を抱えていません。 "Derp"、 "Herp"、 "Sam"、 "Alfred"、 "Bill"の5つの文字列を持つことができます。この種の "Derp"、 "Alfred"、 "Bill" 、 "Herp"、 "Sam"。ガイダンスのために事前に感謝します。

+1

まず、これはバブルソートではありません。最初の問題は – WIR3D

+0

@ WIR3Dです。なぜそうでないのか説明してください。バブルソートの内部ループは、通常、「1」ではなく、「i + 1」で開始する。さて、変数(配列 '' cargohold''ではなく '' String [] cargohold'')ではなく、型の後に配列の括弧を入れてください。 – Turing85

答えて

3

ライン

if(cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) 

if(cargohold[j] != null && cargohold[j-1] != null && (cargohold[j].compareTo(cargohold[j-1]) < 0)) 

であるべきとスワッピングがとして行われるべきである:どことして、バブルソートにあなたが隣接する要素を比較することを忘れないでください

temp = cargohold[j]; 
cargohold[j] = cargohold[j-1]; 
cargohold[j-1] = temp; 

あなたのコードはそれをしません。

i > ji < jが、スワップ・ロジックは同じままで、それは完全に間違っているときのケースがあります。

+1

また、要素が変更されてソートが完了したことを知ることができるかどうかを追跡する必要があります – WIR3D

+0

@ WIR3D、これは離散最適化の1つですが、これはここでのポイントではありません。 –

+0

@SumeetSinghなぜ私のコードとは対照的に、これがうまくいくのか説明できますか? – user8570492

0

あなたの実装は間違っています。ここ

は(Javaのような略記で)バブルソートである:

for (index1 = 0; index1 < array.length - 1; ++index1) 
    for (index2 = index1 + 1; index2 < array.length; ++index2) 
     if (array[index1] < array[index1]) 
      swap(array[index1], array[index2]); 

音符INDEX2 = index1の内側ループの+ 1。いくつかの最適化と

0

バブルソートアルゴリズム:

private static void sortItems(String cargohold[]) { 
    String temp; 
    boolean wasSwap = true; 
    for (int index1 = 0; index1 < cargohold.length - 1 && wasSwap; ++index1) { 
     wasSwap = false; 
     for (int index2 = 0; index2 < cargohold.length - index1 - 1; ++index2) { 
      if (cargohold[index2].compareToIgnoreCase(cargohold[index2+1]) > 0) { 
       temp = cargohold[index2]; 
       cargohold[index2] = cargohold[index2+1]; 
       cargohold[index2+1] = temp; 
       wasSwap = true; 
      } 
     } 
    } 
} 

平均複雑さがO(n)の最良のケースでO(n^2)ています。

関連する問題