2016-11-23 90 views
-2

//我的任務是兩個合併將數組升序ORDER.Your程序將接受每個陣列從鍵盤輸入。您不會提前知道將輸入多少個值,但您可以假設每個數組的最大長度爲10,000個元素。要停止輸入值,請輸入零或負數。您應該忽略任何非正數輸入,並且不要將它們存儲在數組中。 兩個輸入數組的元素應該是遞增的順序。換句話說,每個數組元素的值必須大於或等於前一個元素的值。數組可能包含重複的元素。負陣列和錯誤消息

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號)當我通過該網站運行它必須提交此消息給我如下:

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]){ 

這意味着它只能比較從輸入是在相同位置的元素。這不起作用,並且在事實之後嘗試交換輸出中的元素不足以完成工作。

基本上,而不是有一個指數,相同指數比較兩個輸入數組中的元素,你需要兩個索引。我會讓你從那裏拿走它,但我認爲你可以弄明白。

(我不知道爲什麼你要NegativeArraySizeException