JAVA - 存储Int&浮点数组但不是其他数据类型

时间:2018-01-20 21:39:48

标签: java arrays loops while-loop primitive

我是JAVA的初学者。

我正在编写一个具有菜单的程序,并允许用户选择诸如数组大小,数组中的元素等选项。所以我已经全部工作了,我正在最终确定边界,以便在用户输入不同数据元素的情况下循环回来。

我的问题 - 如何创建一个存储整数和一个循环的循环如果选择另一个原语,浮动但环回?

int a;

for (int i = 0; i<array.length;i++) {
    boolean validate = false;
    System.out.print("Give me a value");
    while (validate == false) {
        a = input.nextInt();
        if (input.hasNextFloat()) {
            numbers[i] = input.nextFloat();
            validate = true;
        }
        else if (input.hasNextInt()) {
            a = input.nextInt();
            numbers[i] = 1.0f *a;
            validate = true;
        }
        else {
            System.out.println("This is not an acceptable primitive. Try again");
            validate = false;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果你得到一个原始类型,第一件事就是你的循环规范。

    if (input.hasNextFloat()) {
        // Catches float
    } else if (input.hasNextInt()) {
        // Catches int
    } else {
        // Catches any other type
    }

当第一个条件捕获float而第二个条件捕获int时,else会捕获任何其他类型。虽然这可能是剩余的6 primitive types中的任何一个,但它也可能是一个字符串(reference type,而不是原始字符。

第二件事是int是有效的float,但float不是有效的int;也就是说,如果您正在扫描浮点数并接收int作为输入,您将接受它作为浮点数。无论如何,当您将int转换为float时,检查int是多余的,因为如果它作为浮点验证失败,它将永远不会成功。

同样关于原语,所有浮点数都是双精度数,所有短数都是整数,有些长数是整数等等。所以你选择“如果选择了另一个原始类型则回环”这一区别是有点不确定的。

另一件事是你尝试在for循环的开头读取一个int - 如果输入不是int,这将抛出InputMismatchException异常。这可能是为了消耗线,但它只是跳过一个值最佳的情况(抛出异常是最糟糕的)。相反,如果确定值不是合适的格式,则应该使用该行,以避免卡在无限循环中。

else {
    System.out.println(input.next() + " is not an acceptable primitive. Try again");
}

validate布尔值仅用于基本上不跳过索引。考虑只是递减for循环中的迭代计数器以避免额外的if语句,因为for循环将再次增加它。虽然这会重新打印“给我一个价值”的信息,但这归结为偏好。

else {
    System.out.println("...");
    i--;
}

这样的事情会达到你想要的效果:

float[] array = new float[3];
Scanner input = new Scanner(System.in);
for (int i = 0; i<array.length;i++) {
    System.out.print("Give me a value: ");
    if (input.hasNextFloat()) {
        array[i] = input.nextFloat();
    } else {
        System.out.print(input.next() + " is not an acceptable type. ");
        i--;
    }
}

需要注意的另一件事是你不需要将int转换为float,除非你明确地想要做什么。 int和float的包装类型都扩展为Number,因此您可以使用Number数组。

   Number array[] = new Number[size];
   ...
   array[0] = 10;
   array[1] = 1.5f;