【问题标题】:JAVA - Storing Int & Float in array but not other data typeJAVA - 将 Int 和 Float 存储在数组中,但不存储其他数据类型
【发布时间】:2018-06-29 21:23:35
【问题描述】:

我是 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;
        }
    }
}

【问题讨论】:

  • 您好@AbbiAb 欢迎使用stackoverflow,我将您的代码缩进以便其他人更容易阅读。
  • intfloat 扩展 Number。因此,您可以创建一个 Numbers 数组并在获得另一种类型的输入时对其进行初始化
  • 您的问题不清楚。你要解决的具体问题是什么? “如果选择了另一个原语”到底是什么意思?此外,您应该展示您的数组声明,因为这似乎非常相关。
  • 最简单的解决方案是从控制台读取字符串并尝试将其解析为 INT 或 FLOAT。如果两个解析都失败,则该条目无效。请记住,Java 数组应该是单类型(intfloat 但不能同时使用),所以您可能需要将条目保留在字符串数组中?

标签: java arrays loops while-loop primitive


【解决方案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 转换为浮点数时,检查 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 转换为浮点数,除非这明确是您想要做的。 int 和 float 的包装器类型都扩展 Number,因此您可以改为使用 Number 数组。

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

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多