2016-11-13 5 views
-1

ベクトルを入力する前にソート方法で数値を追加したいと思います。しかし結果は正しくなく、問題がどこにあるのか混乱していますか? 出力を以下に示します。ベクトルをJavaで入力するときのソート方法

埋め込みメソッドを使用せずにアルゴリズムを使用してソートしたいと思います。

import java.util.Vector; 

public class Test { 
    public static void main(String ar[]){ 
    //Numbers to enter in vector 
    int[] number = {5,2,98,3,10,1}; 

    Vector<Integer> v = new Vector<Integer>(); 

    v.add(number[0]); 
    for(int i=1;i<number.length;i++){ 
      for(int j=v.size();j>0;j--){ 
       System.out.println("Entered: "+number[i]); 
       if(number[i] <= v.get(j-1)){ 
        v.add(j-1,number[i]); 
        break; 
       }else{ 
        v.add(j,number[i]); 
        break; 
       } 
      } 
     } 
    for(int s:v) 
     System.out.print(s + " "); 
    } 
} 

OUTPUT:

が入力:2

が入力:98

が入力:3

が入力:10

入力した:1

+1

ヒント:ネストされたforループが1回実行されるのは、ifまたはelse breakが – user43968

答えて

1

変数jに基づいて2番目の(内部)forループがありますが、 "ループ"は1回だけ実行されます。 jループ内の条件の両方がループを終了させます(break;)。

各番号を追加する場合、唯一可能なのは最後か最後かです。

+0

であるためです。これは、重複する値がベクトルに追加されるためです。 – topper1309

+0

'j'をループしているときに、数字を追加すると - はい - あなたは'中断したいです; '(そうでなければ重複を取得します)。しかし、 'number [i] <= v.get(j-1)'が真であるときは、数値を追加したり、(内部)ループを終了したくない。 'v.get(j-1)'が 'number [i]'であるのはどれくらいですか? 'v.get(j-2)'よりも小さいのでしょうか? 'continue;'を使って見つけてください。 –

0

内部のforループは実際にはループしません。 number[i] <= v.get(j-1)に関係なく、 ループは1ステップ後に終了します。あなたが何をしたいか

され、ベクトルの最初から 反復、 としたときに、挿入したいものより大きいです要素を見つけ、 は、それを挿入して、ループから抜け出します。 これはこれまでのやり方とは逆です。これはベクトルの最後から反復しています。 何も挿入せずにループの最後に達した場合は、 の値を追加します。

プログラムがひどく、あまりにも他のいくつかの改善が必要である:

  • あなたは、スレッドセーフであることがベクトルを必要としない場合は、あなたがVectorは必要ありません。代わりにArrayListを使用してください。
  • 最初の番号の特別扱いは不要です。
  • 外部ループは、for-eachイディオムを使用して、より自然な方法で記述することができます。
  • 要素を印刷するためにループする必要はなく、VectortoString実装はすでに読みやすいです。
  • 変数名は非常に不良であり、簡単に改善することができます。
  • インデントが矛盾しているため、コードを読みにくくしています。問題の固定や提案を適用して

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

for (int current : numbers) { 
    boolean inserted = false; 
    for (int j = 0; j < list.size(); j++) { 
    if (current <= list.get(j)) { 
     list.add(j, current); 
     inserted = true; 
     break; 
    } 
    } 
    if (!inserted) { 
    list.add(current); 
    } 
} 
System.out.println(list); 

なく、少なくとも最後には、代わりに、リストを反復処理することにより、挿入ポイントの探索、 あなたはバイナリ検索を使用してはるかに優れた性能を達成できます特に大きな値のセットの場合は です。

0

あなたの内部ループは複数回ループしていないようです。そのため、キーは正しい場所に挿入されていません。

より簡潔な解決策は、別の簡単な解決策は、あろう

public class Test { 
    public static void main(String ar[]){ 
    //Numbers to enter in vector 
    int[] number = {5,2,98,3,10,1}; 

    Vector<Integer> v = new Vector<Integer>(); 
    v.setSize(number.length); 
    v[0] = number[0]; 

    for(int i=1, vSize = 1; i < number.length; i++, vSize++){ 
      int j = 0, k = 0; 
      for(j = 0; j < vSize; j++) { 
       if(v[j] < number[i]) { 
        break; 
      } 
      for(k = vSize; k > j; k--) { 
       v[k] = v[k -1]; 
      } 
      v[k] = number[i]; 
    } 
    for(int s:v) 
     System.out.print(s + " "); 
    } 
} 
0

あろう:内側forループは単に要素を挿入するための正しいインデックスを見つけるために使用される

import java.util.Vector; 

public class Test { 
    public static void main(String ar[]){ 
    //Numbers to enter in vector 
    int[] number = {5,2,98,3,10,1}; 

    Vector<Integer> v = new Vector<Integer>(); 

    v.add(number[0]); 
    for(int i=1, j;i<number.length;i++){      //j declared here for better scope 
      for(j=v.size();j>0 && v.get(j-1)>number[i] ;j--); //<-- some changes here, 
      v.add(j,number[i]);        //<-- and here 
      } 
     } 
    for(int s:v) 
     System.out.print(s + " "); 
    } 
} 

関連する問題