2017-11-13 4 views
-3

バブルソートアルゴリズムをJavaで作成しようとしていますが、何も返さずにソートしなければならないときは、プログラムが実行されると、それはその何も起こらないしかし後に限り、ソートする前に、アレイを印刷するとして取得しますが、プログラムは、それがJavaの私のバブルソートアルゴリズムはソートを停止せず、何も返さない

package src; 
import java.util.Scanner; 
import java.util.Random; 
import java.util.ArrayList; 
import java.util.List; 

public class bubbleSort { 

    public static void main(String[] args) { 

     int length = getLength(); 

     List<Integer> randomList = createList(length); 

     System.out.println("The list before sorting:\n" + randomList); 

     List<Integer> newList = sortList(randomList, length); 

     System.out.println("The list after sorting:\n" + newList); 



    } 

    public static int getLength() { 
     System.out.println("Please enter how long you want the array to be"); 

     Scanner reader = new Scanner(System.in); 

     int length = Integer.parseInt(reader.nextLine()); 

     return length; 
    } 

    public static List<Integer> createList(int length) { 
     Random rand = new Random(); 

     List<Integer> randomList = new ArrayList<Integer>(); 

     for(int x = 0 ; x < length ; x++){ 
      int randomnumber = rand.nextInt((100 - 1) + 1) + 1; 
      randomList.add(randomnumber); 
     } 

     return randomList; 
    } 

    public static List<Integer> sortList(List<Integer> randomList, int length){ 
     boolean sorted = false; 

     while(sorted == false){ 
      sorted = true; 

      for(int x = 0 ; x < (length - 1) ; x++) { 
       if(randomList.get(x) > randomList.get(x + 1)) { 
        sorted = false; 
        int temp = randomList.get(x + 1); 
        randomList.set((x + 1), (x)); 
        randomList.set((x + 1), temp); 
       } 
      } 
     } 

     return randomList; 
    } 

} 
+2

'randomList.set((X + 1)、(x)); 'それはむしろ' randomList.set((x + 1)、randomList.get(x)); ' –

+0

これは次のようなものです:while(sorted == false){ sorted = true; ? – Stultuske

+0

スワップコードが間違っていないか確認してください。 int temp = randomList。get(x + 1); randomList.set((x + 1)、(x)); randomList.set((x + 1)、temp); –

答えて

1

は、両方の私たちと自分のため(それをより明確にするためにスワップメソッドを作成して実行し続ける停止doesntの):

private void swap(List<Integer> values, x, y) { 
    int temp = values.get(x); 
    values.set(x, values.get(y)); 
    values.set(y, temp); 
} 

その他の提案:

  • 名前あなたのクラスBubbleSortではなくbubbleSort。クラス名の大文字は大文字で始まります。
  • 長さをソートメソッドの第2引数として渡しません。それは重複していて、誰かが卑劣なことにアイテムをリストに追加すると正しくない可能性があります。
  • randomListvaluesまたはnumbersまたはrandomNumbersです。変数名に型を繰り返す必要はありません。
  • sorted == false!sortedに置き換えます。これは
  • getLengthcreateListをフィールドとしてリストで、あなたのソートクラスのインスタンスを作成するためにmain方法を使用することを検討して
  • 民間することができ、共通の、より読みやすい表記です。この方法では、メソッドは互いにリストを渡す必要はありません。あなたのコードは読みやすくなり、オブジェクト指向になります。

EDIT:分離をさらに行い、すべての静的メソッドを「アプリケーション」または「メイン」という別のクラスに移動することができます。以下、編集されたコードを参照してください:

をここでコードが私の提案、次のどのように見えるか大体です:

public class BubbleSort {  

    // a field 
    private List<Integer> numbers; 

    public BubbleSort(List<Integer> numbers) { 
     this.numbers = numbers; 
    } 

    public static List<Integer> sort() { 
     boolean sorted = false; 
     while(!sorted) { 
      sorted = true; 
      for(int x = 0; x < length - 1; x++) { 
       if(numbers.get(x) > numbers.get(x + 1)) { 
        sorted = false; 
        swap(x, x + 1); 
       } 
      } 
     }  
     return numbers; 
    }  

    private void swap(x, y) { 
     int temp = numbers.get(x); 
     numbers.set(x, numbers.get(y)); 
     numbers.set(y, temp); 
    } 

} 

Applicationクラス。

public class Application { 

    public static void main(String[] args) { 

     int length = getLength(); 
     List<Integer> unsorted = createList(length); 
     System.out.println("The list before sorting:\n" + unsorted); 

     // creating an instance of the BubbleSort class 
     BubbleSort bubbleSort = new BubbleSort(unsorted);   
     List<Integer> sorted = bubbleSort.sort(); 

     System.out.println("The list after sorting:\n" + sorted); 
    } 

    private static int getLength() { 
     System.out.println("Please enter how long you want the array to be"); 
     Scanner reader = new Scanner(System.in); 
     return Integer.parseInt(reader.nextLine()); 
    } 

    private static List<Integer> createList(int length) { 
     Random rand = new Random(); 
     List<Integer> numbers = new ArrayList<Integer>(); 
     for(int x = 0 ; x < length ; x++){ 
      int randomnumber = rand.nextInt((100 - 1) + 1) + 1; 
      numbers.add(randomnumber); 
     } 
     return numbers; 
    } 

ところでグッドジョブ離脱それらのメソッドgetLengthcreateList:それは目的は、利用者からの長さを取得し、テストデータを作成して設定し、バブルソートのインスタンスを呼び出すことであるのです。それは正しい考えです。

+0

私は最後のもの以外のあなたの提案をすべて理解しています。インスタンスを作成することはどういう意味ですか、フィールドは何ですか?あなたが愚かな質問であれば申し訳ありません –

+0

私のコードの一番下にある例があります。 'private List numbers;は任意のBubbleSortインスタンスのフィールドです。静的メインメソッドは、 'new BubbleSort(unsorted)'を実行することによってそのようなインスタンスを作成します。オブジェクト(インスタンス)を作成する利点は、より多くのカプセル化を取得できることです。すべてのコードが静的であれば、懸念を分けたり、読みやすい(そしてテスト可能な)コードを作成するのがはるかに難しくなります。静的コードは性質上「手続き型」である傾向があり、オブジェクト指向プログラミングの利点を忘れてしまいます。 –

-1

あなたはミス

これのカップルを作っ:

randomList.set((x + 1), (x)); 
randomList.set((x + 1), temp); 

は次のようになります。

randomList.set((x + 1), randomList.get(x)); 
randomList.set((x), temp); 

フル方法:

public static List<Integer> sortList(List<Integer> randomList, int length){ 
    boolean sorted = false; 

    while(sorted == false){ 
     sorted = true; 

     for(int x = 0 ; x < (length - 1) ; x++) { 
      if(randomList.get(x) > randomList.get(x + 1)) { 
       sorted = false; 
       int temp = randomList.get(x + 1); 
       randomList.set((x + 1), randomList.get(x)); 
       randomList.set((x), temp); 
      } 
     } 
    } 

    return randomList; 
} 
+0

正解に関するdownvoteとは何ですか?私は単に彼のミスを修正した。 –

関連する問題