如何允许用户将负数输入数组并更改起始索引?

时间:2016-12-10 02:47:45

标签: java arrays for-loop infinite-loop

我最近创建了一个应用程序,它读取0到50范围内的多个整数,并计算每个整数输入的次数。我也做了它,它计算每个整数输入的次数。现在,我必须将范围从0更改为50到-25到25.但是,当我输入负数时,我得到一个Out of Bound错误。

我一直在试验数组声明沙子我只需要知道我需要做什么才能改变范围。这是我的代码:

shouldChangeCharactersIn

4 个答案:

答案 0 :(得分:1)

如果您确实需要使用数组来完成任务,那么您可能需要更改逻辑,如下所示。我添加了内联注释来描述逻辑。

首先,您需要更改发生数组的初始化,如下所示,这将在应用程序启动时将所有出现次数初始化为零。

    int[] occur = { 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0 };

然后你需要把输入作为字符串,否则你将无法识别用户是否输入00退出程序。在那之后,可以使用Integer.valueOf(input)将String转换为int。

然后,您可能需要n > 25 || n<-25检查输入是否超出范围。如果超出范围错误消息将打印并再次要求用户输入有效数字。

然后,您需要将for循环初始参数从0更改为发生长度。您不能对数组中的索引使用负值。我相信你将能够理解代码中的其他逻辑。

您可以浏览更新后的代码

import java.util.Scanner;

public class SixTwo {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // int[] nums = new int[51];


    //You need to change the initial data of the occur array to zero
    int[] occur = { 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0 };

    int[] nums = { -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6,
            -5, -4, -3, -2, -1, 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 };

    for (;;) {
        System.out.println("Enter an integer between -25 to 25 (00 to quit)");
        //You need to take input as String other wise you will not be able to find whether user enter 00
        String input = sc.next();
        if(input.equals("00")){
            break;
        }

        int n = 0;

        try {
            n=Integer.valueOf(input);
        } catch (Exception e) {
            continue;
        }

        //You need to add check whether entered number out of range 
        if (n > 25 || n<-25) {
            System.out.println("Out of range");
            continue;
        }

        occur[25+n] = occur[25+n]+1;
    }

    System.out.println("All Occurrences: ");
    for (int i = 0; i < nums.length; i++) {
        System.out.println(nums[i] + ":"+occur[i]);
    }
    System.out.println();

    sc.close();
}
}

然后让我们假设您输入为1,3,4,4,-25,0,0,00

All Occurrences: 
-25:1
-24:0
-23:0
-22:0
-21:0
-20:0
-19:0
-18:0
-17:0
-16:0
-15:0
-14:0
-13:0
-12:0
-11:0
-10:0
-9:0
-8:0
-7:0
-6:0
-5:0
-4:0
-3:0
-2:0
-1:0
0:2
1:1
2:0
3:1
4:2
5:0
6:0
7:0
8:0
9:0
10:0
11:0
12:0
13:0
14:0
15:0
16:0
17:0
18:0
19:0
20:0
21:0
22:0
23:0
24:0
25:0

答案 1 :(得分:0)

您无法访问负数索引处的数字。尝试nums[n + 25]计算出现次数。 从-25到occur.length的迭代也没有意义,因为你只有50个数字而occur.length是50(所以这意味着数组长度是75.你应该从0开始。

答案 2 :(得分:0)

你为什么要使用数组?只需使用地图:

Map<Integer, Integer> counts = new HashMap<>();

然后为每个数字输入:

int n; // input by user
counts.merge(n, 1, (a, b) -> a + b);

在所有输入之后,您将获得每个数字的计数,您输出如下:

counts.forEach(System.out::println);

请注意,这适用于任何整数值。

答案 3 :(得分:0)

错误的原因很简单:Java只允许正整数,0只作为数组,并且你不能改变它。但是,你可以使用Map代替数组。地图基本上是一个数组,但索引可以是任何东西,例如。 G。一个String或负整数,真的是什么。

这是使用Map的即用型代码。我也冒昧地清理了你的源代码,并添加了一些对你有用的技巧,我想:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class SixTwo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Map<Integer, Integer> occur = new HashMap<>();

        // initialize the map with zeros
        for (int i = -25; i <= 25; i++) {
            occur.put(i, 0);
        }

        for (; ; ) {
            // Java does not differentiate between the integers 00 and 0 so better use anything else that is not a
            // valid value, like the word 'quit'
            System.out.println("Enter an integer (Enter quit to quit)");
            // We need to read the input as a String now to recognize the word quit
            String input = sc.nextLine();

            // input=="quit" wouldn't work because Strings are not a primitive datatype
            if (input.equals("quit")) {
                break;
            }

            // Now convert the input to int
            int n = Integer.parseInt(input);

            // Don't forget to check against -25 too
            if (n > 25 || n < -25) {
                System.out.println("Number was out of range, ignoring...");
                continue;
            }
            occur.put(n, occur.get(n) + 1);
        }

        System.out.println("All Numbers entered:");
        for (int i = -25; i <= 25; i++) {
            // print the right number of spaces to get a perfect table
            for (int spc = 4 - Integer.toString(i).length(); spc > 0; spc--) {
                System.out.print(" ");
            }

            System.out.print(i);
        }
        System.out.println();
        System.out.println("All Occurrences: ");
        for (Map.Entry entry : occur.entrySet()) {
            // print the right number of spaces to get a perfect table
            for (int spc = 4 - entry.getValue().toString().length(); spc > 0; spc--) {
                System.out.print(" ");
            }

            System.out.print(entry.getValue());
        }
        sc.close();
    }
}