2016-11-23 12 views
-2

//私のタスクは、昇順に配列する2つのマージです。あなたのプログラムは、各配列をキーボードからの入力として受け入れます。入力する値の数を事前に知っているわけではありませんが、各配列の要素の最大長は10,000と仮定できます。値の入力を停止するには、ゼロまたは負の数を入力します。非正の数の入力は無視し、配列には格納しないでください。 2つの入力配列の要素は、昇順に並べる必要があります。つまり、各配列要素の値は、前の要素値以上でなければなりません。配列には繰り返し要素が含まれることがあります。負の配列とエラーメッセージ

import java.util.Scanner; 
import java.lang.Math; 
class Main { 
    public static void main(String[] args){ 
     Scanner scan = new Scanner(System.in); 

     int one[]= new int[10000]; 
     int two[]= new int[10000]; 

     int lengthShort=0;   

     int lengthLong=0;   



     int a =0;     
     int b =0;     

     System.out.println("Enter the values for the first array, " 
       + "up to 10000 values, enter a negative number to quit"); 


     for(int i=0; i<one.length && scan.hasNext(); i++){ 

      one[i] = scan.nextInt(); 
      a++; 
      if(one[i]<0){ 
       one[i]=0; 
       break; 
      } 
     } 
     int length1 = a-1; 

     System.out.println("Enter the values for the second array, " 
       + "up to 10000 values, enter a negative number to quit"); 

     for(int i=0; i<two.length && scan.hasNext(); i++){ 

      two[i] = scan.nextInt(); 
      b++; 
      if(two[i]<0){ 
       two[i]=0; 
       break; 
      } 

     } 

     int lengthTwo = b-1; 


     int mergeOne[] = new int[length1]; 

     for (int i = 0; i<mergeOne.length; i++){ 
      mergeOne[i]=one[i]; 
     } 
     int mergeTwo[] = new int[lengthTwo];  

     for (int i = 0; i<mergeTwo.length; i++){ 
      mergeTwo[i]=two[i]; 
     } 


     System.out.println("First Array:"); 

     for(int i=0; i<mergeOne.length; i++){ 
     System.out.print(mergeOne[i] + " "); 
     } 


     System.out.println("\nSecond Array:"); 

     for(int i=0; i<mergeTwo.length; i++){ 
     System.out.print(mergeTwo[i] + " "); 
     } 


     if(mergeOne.length<=mergeTwo.length){ 
      lengthLong = mergeTwo.length; 
      lengthShort = mergeOne.length; 
     } 

     else if(mergeOne.length>=mergeTwo.length){ 
      lengthShort = mergeTwo.length; 
      lengthLong = mergeOne.length; 
     } 

     int merged[] = new int[length1 + lengthTwo]; 


     for(int i = 0; i<lengthShort; i++){ 
      if(i==0){ 
       if(mergeOne[i]<=mergeTwo[i]){ 
        merged[i] = mergeOne[i]; 
        merged[i+1] = mergeTwo[i]; 
       } 
       else if(mergeTwo[i]<=mergeOne[i]){ 
        merged[i] = mergeTwo[i]; 
        merged[i+1]= mergeOne[i]; 
       } 
      } 
      else if(i>0){ 
       if(mergeOne[i]<=mergeTwo[i]){ 
        merged[i+i] = mergeOne[i]; 
        merged[i+i+1] = mergeTwo[i]; 
       } 
       else if(mergeTwo[i]<=mergeOne[i]){ 
        merged[i+i] = mergeTwo[i]; 
        merged[i+i+1]= mergeOne[i]; 
       } 
      } 
     } 

     if(mergeOne.length<mergeTwo.length){ 
      for(int k=lengthShort; k<lengthLong; k++){ 
       merged[k]=mergeTwo[k]; 
      } 
     } 

     if(mergeOne.length>mergeTwo.length){ 
       for(int k=lengthShort; k<lengthLong; k++){ 
        merged[k]=mergeOne[k]; 
      } 
     } 

     for(int i = 0; i<merged.length; i++){ 
      if((i+1)==merged.length)   
       break; 
      if(merged[i]>merged[i+1]){ 
       int temp = merged[i+1]; 
       merged[i+1]=merged[i]; 
       merged[i]= temp; 

      } 
     } 

     System.out.println("\nMerged array in order is: "); 

     for(int i = 0; i<merged.length; i++){ 
     System.out.print(merged[i] + " "); 
     } 
    } 
    } 

//私のコードはdrjavaにコンパイルが、私は二つの問題があります。

1)これは、昇順

2で数字を注文しませんが)私は、サイトを通してそれを実行すると、Iこれを提出する必要があります:

Runtime Error 

Exception in thread "main" java.lang.NegativeArraySizeException 
    at Main.main(Main.java:281) 
    at Ideone.assertRegex(Main.java:94) 
    at Ideone.test(Main.java:42) 
    at Ideone.main(Main.java:29) 
+0

なぜあなたはのArray.sort()メソッドを使用していませんか? – barna10

+0

コードにコード以外の部分が含まれないように注意してください。あなたが尋ねていた質問をするのは難しかったです。コードが入ったフレームをスクロールするまで表示されなかったからです。私はそれを修正しました。 – ajb

+0

@ barna10私は、割り当てのポイントはマージアルゴリズムを書くことだと思います。 'Arrays.sort()'を使うことは不正です。 – ajb

答えて

1

あなたはマージアルゴリズムを再考する必要があります。配列を入力したとします。

1 5 10 50 100 500 
2 4 6 8 10 12 14 16 

出力に入れる要素を繰り返し決定する必要があります。だから、N個の要素を選択した後、あなたの出力は

1 2 4 5 6 8 10 10 12 14 

のようになります。そして、あなたはあなたが次を見てする必要があります入力配列に場所を指し示すインデックスを持っている必要があります。

1 5 10 50 100 500 
     ^^ 
2 4 6 8 10 12 14 16 
         ^^ 

として、インデックスが入力配列の非常に異なる場所にある可能性があります。

if(mergeOne[i]<=mergeTwo[i]){ 

それだけ同じ場所にある入力からの要素を比較しています意味:しかし、あなたのコードは、これの多くはありません。これはうまくいきませんし、仕事を完了させるのに十分でない場合は、出力の要素を入れ替えようとしています。

基本的に、1つのインデックスを持ち、2つの入力配列の要素を同じインデックスで比較する代わりに、2つのインデックスが必要です。私はあなたがそこからそれを取るようにしますが、私はあなたがそれを理解することができると思います。

(そして、私はあなたがNegativeArraySizeExceptionを取得している理由はわかりません。)

関連する問題