【问题标题】:Can't Hold a Negative Value in an Array不能在数组中保存负值
【发布时间】:2013-10-17 01:04:25
【问题描述】:

我有一个项目,我需要输入 -25 到 25 之间的数字,并计算每个数字的输入次数。我的代码只接受正数。第 26 行和第 39 行给了我一些问题,我无法让我的数量数组包含任何负数。

我的代码:

public class PP62{

    public static void main(String[] args) {

        char response = 'a';
        int numbers[] = new int[100], count, amount[] = new int[100], n2;
        count = 0;

        do{

        if((response == 'y')||(response == 'Y')||(count == 0)){

            count++;

            System.out.println("Enter in an integer between -25 and 25.");
            do{
            numbers[count] = SavitchIn.readLineInt();

            if((numbers[count] > 25)||(numbers[count] < -25)){
                System.out.println("Error, Invalid Input. Re-Enter integer between -25 and 25.");
            }

            else if((numbers[count] <= 25)||(numbers[count] >= -25)){
                n2 = numbers[count];
                amount[n2]++;
            }

            }while((numbers[count] > 25)||(numbers[count] < -25));

            System.out.println("Enter in another integer? (Y/N)");
            response = SavitchIn.readLineNonwhiteChar();
        }

        else if ((response == 'n')||(response == 'N')){

            for(int a = -25; a <= 25; a++){
                System.out.println(a + "'s entered: ");
                System.out.println(amount[a] + "\n");
            }
            System.exit(0);
        }

        else{
            System.out.println("Incorrect Input. Must be 'Y' (yes) or 'N' (no).");
            response = SavitchIn.readLineNonwhiteChar();
        }}while(count > 0);
    }   
}

【问题讨论】:

  • 第 26 行和第 39 行在哪里?
  • 第 26 行:数量[n2]++; - (在第一个 else if 语句中)第 39 行:System.out.println(amount[a] + "\n"); - (在 for 循环中)

标签: java arrays negative-number


【解决方案1】:

java中的数组索引不能为负数,需要从0开始修复

像这样:

char response = 0;
int numbers[] = new int[51];

do
{
    System.out.println("Enter in an integer between -25 and 25.");
    int n = SavitchIn.readLineInt();
    if( (n > 25) || (n < -25))
        System.out.println("Error, Invalid Input. Re-Enter integer between -25 and 25.");
    else
        numbers[n+25]++;

    System.out.println("Enter in another integer? (Y/N)");
    do
    {
        response = SavitchIn.readLineNonwhiteChar();
        if ( (Character.toLowerCase(response) != 'y') && (Character.toLowerCase(response) != 'n') )
            System.out.println("Incorrect Input. Must be 'Y' (yes) or 'N' (no).");
    } while ( (Character.toLowerCase(response) != 'y') && (Character.toLowerCase(response) != 'n') );
} while (Character.toLowerCase(response) == 'y');

for(int a = -25; a <= 25; a++)
    System.out.println(a + "'s entered: " + numbers[25+a] + " times\n");

【讨论】:

    【解决方案2】:

    在你的代码中

    else if((numbers[count] <= 25)||(numbers[count] >= -25)){
                    n2 = numbers[count];
                    amount[n2]++;
                }
    

    如果n2 = numbers[count] = -25 怎么办? n2 将为负数,amount[n2]++ 访问具有负数索引的数组。您无法访问具有负索引的数组,这样做会导致java.lang.ArrayIndexOutOfBoundsException

    我们为什么不使用大小为50 的数组,而改为使用a[n2+25]++ 计数!

    【讨论】:

      【解决方案3】:

      我无法测试代码,因为我没有 SavitchIn 类,但我注意到该行

      amount[n2]++;
      

      会在某个时候尝试用负数索引一个数组。数组索引从 0 开始。我会推荐

      amount[n2+25]++;
      

      然后

      System.out.println(amount[a-25]+"\n");
      

      在显示屏上。也就是说,将要表示的数字 (-25..25) 移到数组可以处理的范围 (0..50)。

      【讨论】:

      • 感谢您的解释。帮了我很多,但输出时你需要 + 25,而不是减去。
      猜你喜欢
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多