【问题标题】:Java program skips over for loopJava程序跳过for循环
【发布时间】:2014-09-28 00:30:54
【问题描述】:

这个程序的重点是使用递归将一个大数组分解为四个单独的数组,直到每个数组包含小于或等于 1000 个整数。发生这种情况时,数组将被排序,然后添加到 ArrayList。

我的问题是,在声明了四个子数组之后,我的程序完全跳过了 for 循环集并直接进行递归调用,这导致我的数组只填充了零。我不知道为什么会发生这种情况,所以任何见解都将不胜感激。

 public static void quadSort(int[] array, int startIndex, int endIndex) {
            // Insertion sort
            if(endIndex - startIndex <= 1000) {
                for(int i = 0; i <= endIndex; i++) {
                    int x = array[i];
                    int j = i;
                    while(j > 0 && array[j - 1] > x) {
                        array[j] = array[j - 1];
                        j = j - 1;
                    }
                    array[j] = x;
                }

                for(int i = 0; i < array.length; i++) {
                    list.add(array[i]);
                }
            }

            else {

                // Split array into four separate arrays
                int[] a = new int[(endIndex + 1) / 4];
                int[] b = new int[(endIndex + 1) / 4];
                int[] c = new int[(endIndex + 1) / 4];
                int[] d = new int[(endIndex + 1) / 4];

                // Fill separate arrays with initial array's values
                for(int i = 0; i < (endIndex + 1) * (1/4); i++) {

                    for(int k = startIndex; k < (endIndex + 1) * (1/4); k++) {
                        a[i] = array[k];
                    }

                    for(int l = (endIndex + 1) * (1/4); l < (endIndex + 1) * (1/2); l++) {
                        b[i] = array[l];
                    }

                    for(int m = (endIndex + 1) * (1/2); m < (endIndex + 1) * (3/4); m++) {
                        c[i] = array[m];
                    }

                    for(int n = (endIndex + 1) * (1/4); n < endIndex + 1; n++) {
                        d[i] = array[n];
                    }
                }

                quadSort(a,0,a.length - 1);
                quadSort(b,0,b.length - 1);
                quadSort(c,0,c.length - 1);
                quadSort(d,0,d.length - 1);
            }
        }

【问题讨论】:

  • 你应该知道Java的Integer Arithmetic。例如,1/2 或 1/4 的计算结果为零。
  • 哦,真的。我觉得自己像个白痴。我用它来填充我的数组到原始数组的四分之一大小。有什么想法可以用不同的符号来实现相同的目标吗?
  • for 循环也将导致所有子数组元素相同。
  • 请说出你的目标。
  • 我有 int n = {endIndex + 1) * (3/4) 让 for 循环从列表的第三季度开始。如果不使用除法,我将如何表达同样的事情?

标签: java arrays loops for-loop skip


【解决方案1】:

问题是1/4 的计算结果为零(它是一个整数除法,所以小数被丢弃了)。您可以通过将不等式两边都乘以 4 来解决此问题,如下所示:

for(int i = 0 ; 4*i < (endIndex + 1) ; i++)
    ...

现在条件在逻辑上是等价的*,但是它的计算没有使用除法。

* 假设没有溢出

【讨论】:

  • 哦,呵呵。非常感谢。
【解决方案2】:
for(int i = 0; i < (endIndex + 1) * (1/4); i++) 

由于整数除法,将精确迭代 0 次。

【讨论】:

    【解决方案3】:

    这是一个整数算术的例子。

    如果你运行这个:

     System.out.println(1/4);
    

    你会得到0。

    另一方面,这个:

    System.out.println(1.0f/4.0f);
    

    给0.25。


    使用它,您可以将循环更改为:

    for(int i = 0; i < (endIndex + 1) * (1.0f/4.0f); i++)
    

    或者,您可以跳过除法并使用预先计算的值:

    for(int i = 0; i < (endIndex + 1) * .25f; i++)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多