2017-03-07 106 views
0

我需要連排序和使用數組列表賠率ArrayList的排序

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Random; 

public class SortedEvensAndOdds { 

public static void main(String[] args) { 
    Random rnd = new Random(); 
    ArrayList<Integer> evenPrint = new ArrayList<Integer>(); 
    ArrayList<Integer> oddPrint = new ArrayList<Integer>(); 
    int odd[] = new int[25]; 
    int numOdd = 0; 
    int even [] = new int[25]; 
    int numEven = 0; 
    for (int i=0;i<25;i++) { 
     int num = rnd.nextInt((100 - 1) + 1) + 1; 
     if (num%2 ==0) { 
      even[numEven] = num; 
      numEven++; 
     } 
     else { 
      odd[numOdd] = num; 
      numOdd++; 
     } 
    } 
    for (int i = 0; i < even.length; i++) 
     evenPrint.add(even[i]); 
    for (int i = 0; i < even.length; i++) 
     oddPrint.add(odd[i]); 
    Collections.sort(evenPrint); 
    Collections.sort(oddPrint); 
    System.out.println("Even:"); 
    for (int i=0;i<numEven;i++) 
     System.out.print(evenPrint.get(i) + " "); 
    System.out.println("\nOdd:"); 
    for (int i=0;i<numOdd;i++) 
     System.out.print(oddPrint.get(i) + " "); 


} 
} 

這是我的輸出

Even: 
0 0 0 0 0 0 0 0 0 6 6 14 28 36 38 54 
Odd: 
0 0 0 0 0 0 0 0 0 

如何防止所有0的

順便說一句,如果我拿出「Collections.sort()」方法將會是

Even: 
16 32 22 54 90 70 50 60 40 12 60 78 86 52 
Odd: 
59 35 53 35 87 67 75 33 75 59 87 

所以這告訴我的財產以後與分揀 去錯了,請幫忙

回答

3

當你創建一個這樣的數組:int odd[] = new int[25];你得到它是一個零數組,其中25個。這是因爲int不能爲空。

所以,當你排序所有的數組末尾的零被移動到數組fe的開頭。 1,5,9,13,19,0,0,0,0之前分類到0,0,0,0,1,5,9,13,19因爲你只打印索引,你知道你assiged有數量

for (int i=0;i<numEven;i++) 
    System.out.print(evenPrint.get(i) + " "); 

通知numEven。它不打印整個數組。要打印整個數組,你應該寧願使用:

for (int i = 0; i < evenPrint.size(); i++) 
    System.out.print(evenPrint.get(i) + " "); 

你會得到這樣的事情:

0 0 0 0 0 0 0 0 0 0 0 0 10 32 32 38 40 50 60 64 70 74 82 88 96

如何預防呢?

不要將數組的每個單個元素列出。變化:

for (int i = 0; i < even.length; i++) 
    evenPrint.add(even[i]); 
for (int i = 0; i < even.length; i++) 
    oddPrint.add(odd[i]); 

到:

for (int i = 0; i < numEven; i++) 
    evenPrint.add(even[i]); 
for (int i = 0; i < numOdd; i++) 
    oddPrint.add(odd[i]); 
1

的2環for (int i = 0; i < even.length; i++):而不是使用even.length你應該使用numEvennumOdd,只要你想添加偶數和奇數的不僅僅是數量,你找到了。這將擺脫零(當您初始化oddeven陣列時,它們充滿零,您將添加到evenPrintevenOdd陣列)。 當你排序時,所有的零都會開始,當你不排序的時候不會發生。

1

如果你沒有在你的代碼的其他地方使用int odd[]int even[]陣列,比你可以完全省略陣列擺脫那些神祕零。你會變得更短 - 巫婆總是很好 - 並且代碼更具可讀性。

所以,如果有可能,我會將隨機生成的數字添加到列表直接

public static void main(String[] args) { 
    Random rnd = new Random(); 

    ArrayList<Integer> evenPrint = new ArrayList<Integer>(); 
    ArrayList<Integer> oddPrint = new ArrayList<Integer>(); 

    for (int i = 0; i < 25; i++) { 
     int num = rnd.nextInt((100 - 1) + 1) + 1; 

     if (num % 2 == 0) { 
      evenPrint.add(num); 
     } 
     else { 
      oddPrint.add(num); 
     } 
    } 

    Collections.sort(evenPrint); 
    Collections.sort(oddPrint); 

    System.out.println("Even:"); 
    evenPrint.forEach(e -> System.out.print(e + " ")); 

    System.out.println("\nOdd:"); 
    oddPrint.forEach(e -> System.out.print(e + " ")); 
} 

通知:我以前lambda expressions在印刷部縮短。