关于java:在循环条件下不跟随的整数变量

Integer variable not following while loop conditions

关于数组和int变量,我的代码一直有问题。在我遇到问题的部分中,我试图检查数组(其中用户输入自己的整数)是否按递增顺序排列,如果按递增顺序排列,则打印数组;如果不按递增顺序排列,则显示错误消息。我尝试使用int-two变量来实现这一点,一个称为c1,另一个称为ordercheck1(都初始化为0)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int[ ] list1 = new int [10000];

int a1 =0;
int b1 =0;
int c1 =0;
int value1;
int orderCheck1 =0;

while (a1 ==0){
  if (b1 < list1.length){
    value1 = scan.nextInt();
    //checks to see if value entered is positive
    if (value1 >=0){
      list1[b1] = value1;
      b1++;
    }
    else{
      a1 =1;
    }
  }
}

while (c1 <(list1.length-1)){
  if (list1[c1] >list1[(c1+1)]){
    orderCheck1 =1;
  }
  c1++;
}

if (orderCheck1 ==0){
  for (int i =0; i < b1; i++){
    System.out.print (list1[i] +"");
  }
}
else{
  System.out.println ("ERROR: One or both arrays are not in an increasing order.);
}

基本上,如果数组中的数字大于它后面的数字,ordercheck将变为1。在代码后面,它检查ordercheck1是零还是一。如果ordercheck1为零,则会打印数组中的整数;如果为零,则会显示错误消息。问题是,不管我输入什么,ordercheck1总是变成一个,所以错误消息总是被打印出来。我的代码有什么问题?

注意:当用户在数组中输入值时,应该输入一个负数以停止输入值。


我认为,主要的问题是,您已经分配了一个包含10000个元素的列表,而您并没有全部使用它们。Java将元素初始化为0。(请注意,在某些其他语言中,这样的构造可以将元素初始化为随机垃圾值。)

然后编写一个循环,输入数字,直到用户输入一个负数。这将为某个数字n设置循环的前n个元素。但其余元素不会从数组中截断。它们仍然在那里,它们仍然是0。

这会导致此循环出现问题:

1
2
3
4
5
6
while (c1 <(list1.length-1)){
  if (list1[c1] >list1[(c1+1)]){
    orderCheck1 =1;
  }
  c1++;
}

注意,即使用户没有输入10000个值,list1.length仍然是10000个。一旦用new int[10000]或类似的东西创建了一个数组,就可以修复数组的.length。此长度不能更改。这意味着无论输入多少值,c1都将达到9999。

因此,在某一点上,您会遇到这样一个情况:您开始比较创建数组时放入数组中的0值。因为用户输入的所有值都是正数,所以当list[c1]是最后输入的值时,list1[c1] > list1[c1+1]将为真,因为list1[c1+1]仍为0。

解决方案是,不要让c1进入list1.length-1系统,我认为,当它达到少于用户条目的数目时,你必须停止它。看起来您已经有了一个计算条目数的b1,因此需要将while更改为while (c1 <,一些使用的表达式b1)。我会让你努力把上限调整好。

还有一件事:当您有一个这样的数组,它的大小实际上不知道时,最好使用ArrayList。与int[]不同,ArrayList将随着添加元素而增长,size()方法将返回实际添加的元素数。


我建议一种方法:

1
2
3
4
5
6
static boolean isAscending(int[] nums) {
    for (int i = 1; i < nums.length; i++)
        if (nums[i - 1] > nums[i])
            return false;
    return true;
}

请注意,这将正确处理大小为零或一的数组的边缘大小写。