2016-08-26 39 views
1

我必須在同一個數組中分隔0和1。我寫了邏輯,但沒有得到正確的輸出。你能檢查一下代碼嗎?讓我知道什麼是錯誤。如何調試不按預期工作的switch語句?

package Segregate; 

public class Segregate { 

    public void segregate0and1(int arr[], int arr_size){ 

     int i=0; 
     int j=arr_size-1; 
     while(j>=i){ 
      switch(arr[i]){ 
      case 0:{ 
       i++; 
      } 
      case 1: { 


       int temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
       j--; 

     } 
      } 

     } 

    } 

    public static void main(String[] args) { 
     Segregate seg = new Segregate(); 
     int arr[] = {0, 1, 0, 1, 0,0,1}; 
     int arr_size = arr.length; 
     seg.segregate0and1(arr, arr_size); 

     System.out.print("Array after segregation is "); 
     for (int k = 0; k < arr_size; k++){ 
      System.out.print(arr[k] + " "); 
     } 
    } 

} 
+5

您在第一種情況下缺少中斷 - https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html –

+0

這與http://stackoverflow.com/questions/類似31193334/array-containing-only-0-1-and-2/31204057#31204057 –

+0

如果'switch'語句沒有按預期工作,請確保包含'default:'-label (最好有一些調試動作)。 – greybeard

回答

3

我建議到陣列,而不是代碼和邏輯

public static void main(String[] args) { 
    int arr[] = { 0, 1, 0, 1, 0, 0, 1 }; 
    Arrays.sort(arr); 
    System.out.println(Arrays.toString(arr)); 

    } 
+0

非常好!我不知道'Arrays.sort'存在! –

+0

該班是非常好的,並有助於:) –

+0

簡單和乾淨的事情 – whyn0t

0

更好的做事方法複雜排序。點擊Here作爲src。

替換此

public void segregate0and1(int arr[], int arr_size){ 

    int i=0; 
    int j=arr_size-1; 
    while(j>=i){ 
     switch(arr[i]){ 
     case 0:{ 
      i++; 
     } 
     case 1: { 


      int temp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = temp; 
      j--; 

    } 
     } 

    } 

} 

void segregate0and1(int arr[], int size) 
{ 
    /* Initialize left and right indexes */ 
    int left = 0, right = size - 1; 

    while (left < right) 
    { 
     /* Increment left index while we see 0 at left */ 
     while (arr[left] == 0 && left < right) 
      left++; 

     /* Decrement right index while we see 1 at right */ 
     while (arr[right] == 1 && left < right) 
      right--; 

     /* If left is smaller than right then there is a 1 at left 
      and a 0 at right. Exchange arr[left] and arr[right]*/ 
     if (left < right) 
     { 
      arr[left] = 0; 
      arr[right] = 1; 
      left++; 
      right--; 
     } 
    } 
} 
0

break語句中的switch-case-結構缺少更換。它應該與此類似:(爲了完整性,我還包括default)。

public void segregate0and1(int arr[], int arr_size){ 
    int i=0; 
    int j=arr_size-1; 
    while(j>=i){  
     switch(arr[i]){ 
     case 0:{ 
      i++; 
      break; 
     } 
     case 1: { 
     int temp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = temp; 
      j--; 
      break; 
     } 
     default: 
     //empty 
     } 
    } 
} 

爲了測試我添加了一個System.out.println權背後的while。輸出是

[email protected]:~$ java Segregate 
[0, 1, 0, 1, 0, 0, 1] 
[0, 1, 0, 1, 0, 0, 1] 
[0, 1, 0, 1, 0, 0, 1] 
[0, 0, 0, 1, 0, 1, 1] 
[0, 0, 0, 1, 0, 1, 1] 
[0, 0, 0, 1, 0, 1, 1] 
[0, 0, 0, 0, 1, 1, 1] 

最後一行包含「排序」數組。