2016-12-04 5 views
-2

私は、2つの配列の値を入力して別々に出力し、昇順にマージされた配列を出力するようにユーザーに依頼する必要があります。My Arrayのマージ/ソート(Java)

たとえば、ユーザーが最初の配列に2,5,8,0を入力し、2番目の配列に6,7,0を入力すると、結合された配列は2,5,6,7,8を出力します。

最初の2つのアレイの出力は完全に機能しますが、マージされたアレイは常にゼロを出力します。また、ユーザーが再試行したいかどうかを確認するために、再起動ブール値を追加しました。私が立ち往生しているように私を助けてください。

私はこのプロセスを理解していますが、これを自分のコードに実装する方法がわかりません。ここに私のコードは次のとおりです。

//import packages 
import java.util.Scanner; 
import java.lang.Math; 
import java.util.Arrays; 

public class Main4{ 

public static void main(String[] args){ 

boolean doItAgain = true;//add boolean value to use when restarting progam 

Scanner scan = new Scanner (System.in);//initialize new scanner 

while(doItAgain){ 

//initialize variables 
int first [] = new int[10000];//initialize to maximum of 10,000 integers 
int second [] = new int[10000];//initialize to maximum of 10,000 integers 
int input1; 
int input2; 
int counter1 = 0;//counter variable for first string 
int counter2 = 0;//counter variable for second string 


System.out.println(""); 
System.out.println("Welcome To my Merge Array Program 2.0!"); 
System.out.println("Enter the values for the first array, up to 10000 values, enter zero or a negative number to quit"); //asks user for first array input 

//loop to go through each index 
for (int a = 0; a<10000; a++) 
{ 
    input1 = scan.nextInt();//stores input as input1 
    first [a] = input1; 
    counter1++; 
    if (input1<=0) 
    break;//breaks out of loop if input1 value is 0 or below 
} 

int first2 []= new int [counter1-1]; 
for(int b = 0; b<first2.length; b++) { 
    first2 [b] = first[b]; 
} 


System.out.println("Enter the values for the second array, up to 10000 values, enter zero or a negative number to quit"); //asks user for second array input 

for (int j = 0; j<10000; j++) 
{ 
    input2 = scan.nextInt();//stores input as input2 
    second [j] = input2; 
    counter2++; 
    if (input2<=0) 
    break;//breaks out of loop if input1 value is 0 or below 
} 

int second2 []= new int [counter2-1]; 
for(int c = 0; c<second2.length; c++) { 
    second2 [c] = second[c]; 
} 

System.out.println("First Array:");//output first array values in the order of their input 
for (int p=0; p<first2.length; p++) { 
    System.out.print(first2[p] + " "); 
} 
    System.out.println("\nSecond Array:");//output second array values in the order of their input 
    for (int p2=0; p2<second2.length;p2++) { 
    System.out.print(second2[p2] + " "); 
    } 

    boolean valid = true; 
    for (int e = 0; e<first2.length-1; e++) { 
    if(first2[e]>first2[e+1]) { 
     valid = false; 
    } 

    } 
    for (int e2 = 0; e2<second2.length-1;e2++) { 
    if(second2[e2]>second2[e2+1]) { 
     valid = false; 
    } 
    } 


    int[] array = new int[first2.length + second2.length]; 

    //fill array 3 with arrays 1 & 2 
    for(int k = 0; k <first2.length;k++){ 
    array[k] = first2[k]; 
    } 

    for (int l = 0; l<second2.length; l++){ 
    array[first2.length + l] = second2[l]; 
    } 

    //sort array 3 
    for (int i = 0; i<first2.length + 1; i++){ 
    for (int j = i+1; j<first2.length + 1; j++){ 

     if(array[i] > array[j]){ 
     int temp = array[i]; 
     array[i] = array[j]; 
     array[j] = temp; 
     } 
    } 
    } 

    //output sorted merged array 
    System.out.println("\nMerged Array: "); 
    for(int p3 = 0; p3<array.length; p3++) { 
    System.out.print(array[p3] + " "); 
    } 

    //Asks user if they want to restart program. Used boolean value to initialize doItAgain variable 
    System.out.println(""); 
    System.out.println(""); 
    System.out.println("Thanks for using this program! Do you want to do it again? (Y or N)"); 

    if(scan.next().toLowerCase().equals("y")){ 

    doItAgain = true; 
    break; 
    } 

    else{ 

    doItAgain = false; 
    System.out.println("If you change your mind and want to run it again, type runMain.");//output closing statement if user says N to restart 
    break; 
    } 
} 
} 
} 
+2

質問を編集しないでください。後でそれにつまずくかもしれない人にとっては意味がありません。 – Makoto

答えて

1

あなたのarraysをマージされていません。あなたの第1のarrayは例えば[1 2]であり、あなたの2番目のarrayは例えば[3 4]です。最終的な配列はサイズ4(first2.length + second2.length)で初期化されますが、要素はすべてゼロになります。ここでは、この行で

、私はあなたがarrayあなたの最終を埋めるためにarraycopy()を使用することをお勧め:

int[] array = new int[first2.length + second2.length]; 

System.arraycopy(first2, 0, array, 0, first2.length); 
System.arraycopy(second2, 0, array, first2.length, second2.length); 

これはあなたの最後の列の開始位置にfirst2配列をコピーし、位置にあなたのsecond2配列をコピーします。最後の配列のfirst2が終了しました。 https://www.tutorialspoint.com/java/lang/system_arraycopy.htm

を:あなたはここに、このページを参照してください[1 2 3 4]で終わるだろうと、この場合には、それらはすでにソートしているものの、その後(の要素を並べ替えることができます

arraycopy()の詳細については。 EDIT:

//output sorted merged array 
System.out.println("\nMerged Array: "); 
for(int p3 = 0; p3<array.length; p3++) { 
    System.out.print(array[p3] + " "); 
} //right here, you need to close this curly bracket 

EDIT2:あなたはarraycopy()を使用することはできませんので、あなたはUできるところで、あなたは、右ここでエラーをフルソートされた配列を印刷するからあなたを妨げているものをされてい最終配列に記入するループ:

for(int k = 0; k <first2.length;k++){ 
    array[k] = first2[k]; 
} 

for (int l = 0; l<second2.length;l++){ 
    array[first2.length + l] = second2[l]; 
} 
+0

@JohnHughes 'for'ループを使って、最後の配列の' 0'を他の2つの配列の要素( 'first2'と' second2')に置き換えます。 –

+0

@ JohnHughesこれは最終的な配列なので、4つのゼロは技術的に正しいです。私が言及した 'for'ループを使用すれば正常に動作します。 "はい再起動"、あなたは回避する必要があります。 –

+0

上記の編集で、どこに置くのですか? –