【问题标题】:How to debug a switch statement that does not work as expected?如何调试不能按预期工作的 switch 语句?
【发布时间】:2016-08-26 18:53:32
【问题描述】:

我必须在同一个数组中分隔 0 和 1。我已经编写了逻辑,但没有得到正确的输出。你能检查一下代码,让我知道是什么错误。

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] + " ");
        }
    }

}

【问题讨论】:

标签: java algorithm


【解决方案1】:

我建议对数组进行排序,而不是使代码和逻辑复杂化

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

    }

【讨论】:

【解决方案2】:

switch-case-construct 中缺少break 语句。它应该与此类似:(为了完整起见,我还包括了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 
      }
  }
}

为了测试,我在while 后面添加了一个System.out.println。输出是

stefan@mars:~$ 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]

最后一行包含“排序”数组。

【讨论】:

    【解决方案3】:

    更好的做事方式。点击Here获取源。

    替换这个

     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--;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2021-05-23
      • 1970-01-01
      • 2020-03-05
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多