2017-03-27 143 views
0

我是新來的Java,並堅持以下任務。我們正在處理數組,並且應該根據我們的輸入創建一個長度爲數組的數組。除main()之外不允許其他方法。排序爲偶數和奇數的輸入數組

然後,輸入數組將隨機選擇0-999之間的整數並將它們放入數組中,然後我們應該創建一個具有相同數字和長度的新數組,但首先按偶數然後再按奇數排序。

實施例:

How many variables do you want? 4  

Here are the random variables: 4 7 8 1 
Here are the sorted variables: 4 8 7 1 
Of your chosen variables 2 are even and 2 are odd 

到目前爲止我的代碼是這樣的。

public static void main(String[] args) 
{ 
    int checker; 
    int even = 0; 
    int odd = 0; 

    Scanner s = new Scanner(System.in); 

    System.out.print("How many variables between 0-999 you want?: "); 

    int n = s.nextInt(); 

    int arr[] = new int[n]; 
    int ord[] = new int[n]; 

    for(int i = 0; i < n; i++) 
    { 
     arr[i] = (int) (Math.random() * 100) + 1; 
    } 

    System.out.print("Here are your random numbers: "); 

    for(int i : arr) 
    { 
     System.out.print(i + " "); 
    } 

    for(int i = 0; i < n - 1; i++) 
    { 
     checker = arr[i] % 2; 

     if(checker == 0) 
     { 
      even = even + 1; 
     } 
     else 
     { 
      odd = odd + 1; 
     } 
    } 

    System.out.print("Of the chosen numbers" + even + "is even and" + odd + "is odd"); 
} 
+1

我想你應該特別說明你遇到了什麼問題,並且至少在排序算法上做了一個嘗試。 – markspace

+0

你有麻煩嗎?你的問題在哪裏?如果您可以幫助縮小問題範圍,那麼將會更加順暢。 –

+0

順便說一下,您可以按位與RMB與01來檢查變量是否爲單數。 – TheBlueCat

回答

0

首先,arr[i]=(int)(Math.random()*100)+1;是錯誤的。這會給你一個1-100範圍內的數字,而不是0-999。你需要把它寫這樣的:

arr[i]=(int)(Math.random()*1000);

其次,你最後的for循環的條件是i<n-1而不是i<n。這也需要修復。

現在,我們只需要對數組進行排序。我們已經遍歷數組來計算偶數和奇數的數量,所以我們不妨同時對數組進行排序。

讓我們有兩個額外的空數組,一個爲偶數,一個爲奇數,在這裏我們暫時存儲值:現在

int[] evens = new int[n]; 
int[] odds = new int[n]; 

,每次我們找到一個奇數或偶數,我們可以將它們插入到這些陣列中的一個:

if(checker == 0) { 
    evens[even] = arr[i]; //new line of code 
    even = even + 1; 
} else { 
    odds[odd] = arr[i]; //new line of code 
    odd = odd + 1; 
} 

現在,我們要做的就是插入值這兩個數組,進入決賽陣列ord

for(int i=0; i<even; i++) { 
    ord[i] = evens[i]; 
} 

for(int i=0; i<odd; i++) { 
    ord[even+i] = odds[i]; 
} 

現在我們有了排序後的數組,就像我們想要的那樣。

現在你可以打印它只是你印在排序的數組的方式:

System.out.print("Here are the sorted variables:"); 
for(int i : ord) { 
    System.out.print(i + " "); 
} 
0

我看到一些人打我了,但是我會回答,反正給你一些建議。

這是您應該添加在最後一個for循環後面的代碼。

int iEven=0;  // the even part starts at the beginning 
    int iOdd=even; // the odd part starts where the even one ends 
    for(int i=0; i<n; i++){ 
     if(arr[i] % 2 == 0){ 
      ord[iEven] = arr[i]; 
      iEven++; 
     }else{ 
      ord[iOdd] = arr[i]; 
      iOdd++; 
     } 
    } 

    System.out.print("\nHere are the sorted variables: "); 
    for(int i:ord){ 
     System.out.print(i+" ");  
    } 

它所做的是將偶數置於數組的開頭,偶數置於偶數的結尾。

您還應該修復您的for循環:'for(int i = 0; i < n - 1; i ++)'。 在這種情況下,它會比你想要的少一次。 要麼把'我< = N-1''我< N',或最好的選擇是使用「我<陣列。長度爲',每當你改變陣列時它都會改變,你不必擔心每次都改變它。

而現在的意見...編寫代碼是這樣的:

檢查=改編[I]%2; 如果(方格== 0)

可以這樣改進:

如果(ARR [I]%2 == 0)

,它看起來更好。

另一件事,這將使編程更容易爲你使用我由1增加變量++(或我 -)這樣可以節省一點點的打字。或者,如果您想增加更多,請使用i + = 3i- = 7

希望這有助於

+0

很好的答案。但是,'i'已經設置爲數組的長度。編寫'arr.length'而不是'n'沒有意義。 – Gendarme

0

最好的解決辦法是寫自己的比較: 一比較,如果他們一個是偶數,另一個奇怪。如果他們是你已經知道哪一個應該先走,否則自然比較。

Integer ord[] = new Integer[n]; 
Arrays.asList(arr).stream().sorted(new Comparator<Integer>() { 
             @Override 
             public int compare(Integer o1, Integer o2) { 
              if (o1 % 2 == 0 && o2 % 2 == 1) { 
               return -1; 
              } else if (o1 %2 == 1 && o2 % 2 == 0) { 
               return 1; 
              } 
              return o1.compareTo(o2); 
             } 
            }).collect(Collectors.toList()).toArray(ord); 
+1

我會稱之爲過於複雜的事情。原來的海報也說沒有其他的方法比'main()'容許,所以我認爲'compare()'在這裏是一個nogo。 –

0

你可以通過修改你的最終循環來做到這一點。關鍵是從前面用偶數填充陣列,並從後面用奇數填充。當你完成後,even索引會告訴你有多少偶數。像這樣:

int even = 0; 
int odd = n-1; 
for(int i = 0; i < n; i++) 
{ 
    checker = arr[i] % 2; 

    if(checker == 0) 
    { 
     // even numbers fill from 0, forward 
     ord[even] = arr[i]; 
     ++even; 
    } 
    else 
    { 
     // odd numbers fill from n-1, backward 
     ord[odd] = arr[i]; 
     --odd; 
    } 
} 

System.out.print("Of the chosen numbers" + even + "is even and" + (n-even) + "is odd");