0

我有一个数组

int[] arr = {9,20,-2,-45,23,5,1};

我正在使用

java.util.Arrays.sort(arr);

for 循环:

for(int i =0;(i<arr.length) && (arr[i] > 0) ; i++)

由于这种情况,似乎不起作用(arr[i] > 0)。我想不出为什么这不起作用的原因。令人惊讶的是,以下循环以预期的方式工作:

for(int i =0;(i<arr.length) && (arr[i] != 0) ; i++)

for(int i =0;(i<arr.length) && (arr[i] < 0) ; i++)
4

5 回答 5

6

java.util.Arrays.sort(int[] arg);按升序排序,因此arr[0]排序后的第一个值 ( ) 将为 -45。for(int i =0;(i<arr.length) && (arr[i] > 0) ; i++)自 以来的第一次迭代将是错误的arr[0] == -45,因此(arr[0] > 0)是错误的。)

于 2013-01-04T19:32:38.160 回答
2

对数组进行排序后,-45成为第一个元素,因此> 0检查立即评估为false.

另一方面,对前两个元素< 0求值,对整个数组求值。true!= 0true

于 2013-01-04T19:33:14.400 回答
1

本质上,在您对数组进行排序后,您的循环将永远不会运行。

该条件arr[i] > 0无效,因为您将遇到的第一个元素将小于 0。

arr[i] != 0只要您的数组中没有 0,该条件就会一直运行。

该条件arr[i] < 0仅适用于前两个元素。

于 2013-01-04T19:33:27.237 回答
1

第一个循环在第一项之前停止,因为arr[0]它是负数。

如果您只想在循环中获取正元素,正确的语法是:

    for (int i = 0; (i < arr.length) ; i++) {
        if (arr[i]> 0) {
            // Do stuff
        }
    }
于 2013-01-04T19:38:20.390 回答
1

Arrays.sort()默认情况下,将根据给定数组的natural order. 因为int那将意味着上升。鉴于此,以下是您的 3 个循环的播放方式:

for (int i =0; (i<arr.length) && (arr[i] > 0); i++)

当循环初始化i=0arr[0] = -45. 这没有通过检查中的第二个条件(arr[i] > 0),并且循环被“跳过”。

for (int i =0; (i<arr.length) && (arr[i] != 0); i++)

0因为您的数组中没有值为 的元素(arr[i] != 0)总是计算为true。这样一来,循环就会沿着数组的长度插入。

for (int i =0; (i<arr.length) && (arr[i] < 0); i++)

这个循环应该只打印数组的前 2 个元素,arr[0] = -45并且arr[1] = -2. 与第一个循环相同的推理。

总结一下:

如果你想打印整个排序数组,你唯一关心的就是不要跑过数组的两端并导致IndexOutOfBoundsException. 因此,只需从 开始,0直到到达arr.length。您可能还想查看.Arrays.sort()

于 2013-01-04T19:44:23.437 回答