JAVA - 将 Int 和 Float 存储在数组中而不是其他数据类型
JAVA - Storing Int & Float in array but not other data type
我是 JAVA 的初学者。
我正在编写一个程序,它有一个菜单,让用户能够 select 选项,例如数组的大小、数组中的元素等等。所以我已经完成了所有工作,并且我正在最终确定边界以在用户输入不同数据元素的情况下循环返回。
我的问题 - 如果 selected 另一个基元,我如何创建一个循环来存储整数和浮点数但回送?
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;
}
}
}
第一件事是关于在获得基本类型时循环返回的规范。
if (input.hasNextFloat()) {
// Catches float
} else if (input.hasNextInt()) {
// Catches int
} else {
// Catches any other type
}
当第一个条件捕获 float
并且第二个条件捕获 int
时,else 将捕获任何其他类型。虽然这可能是其余 6 个 primitive types, it may also be a String (which is a reference type 中的任何一个,但不是原始的。
第二件事是int是一个有效的float,但是float不是一个有效的int;也就是说,如果您正在扫描一个浮点数并接收一个 int 作为输入,您将接受它作为一个浮点数。无论如何,当您将 int 转换为 float 时,检查 int 是多余的,因为如果它作为 float 验证失败,它将永远不会成功。
同样,对于基元,所有浮点数都是双精度数,所有短整数都是整数,一些长整数是整数,等等。所以你对 "loop back if another primitive type is selected" 的区分有点不确定。
另一件事是您尝试在 for 循环的开头读取一个 int - 如果输入不是 int,这将引发 InputMismatchException
异常。这可能是为了消耗线路而完成的,但它只是跳过了价值最好的情况(抛出最坏的异常)。相反,如果确定值的格式不合适,则应使用该行以避免陷入无限循环。
else {
System.out.println(input.next() + " is not an acceptable primitive. Try again");
}
validate
布尔值仅用于基本上不跳过索引。考虑只减少 for 循环中的迭代计数器以避免额外的 if 语句,因为 for 循环会再次增加它。尽管这将重新打印 "Give me a value" 消息,所以这归结为偏好。
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;
我是 JAVA 的初学者。
我正在编写一个程序,它有一个菜单,让用户能够 select 选项,例如数组的大小、数组中的元素等等。所以我已经完成了所有工作,并且我正在最终确定边界以在用户输入不同数据元素的情况下循环返回。
我的问题 - 如果 selected 另一个基元,我如何创建一个循环来存储整数和浮点数但回送?
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;
}
}
}
第一件事是关于在获得基本类型时循环返回的规范。
if (input.hasNextFloat()) {
// Catches float
} else if (input.hasNextInt()) {
// Catches int
} else {
// Catches any other type
}
当第一个条件捕获 float
并且第二个条件捕获 int
时,else 将捕获任何其他类型。虽然这可能是其余 6 个 primitive types, it may also be a String (which is a reference type 中的任何一个,但不是原始的。
第二件事是int是一个有效的float,但是float不是一个有效的int;也就是说,如果您正在扫描一个浮点数并接收一个 int 作为输入,您将接受它作为一个浮点数。无论如何,当您将 int 转换为 float 时,检查 int 是多余的,因为如果它作为 float 验证失败,它将永远不会成功。
同样,对于基元,所有浮点数都是双精度数,所有短整数都是整数,一些长整数是整数,等等。所以你对 "loop back if another primitive type is selected" 的区分有点不确定。
另一件事是您尝试在 for 循环的开头读取一个 int - 如果输入不是 int,这将引发 InputMismatchException
异常。这可能是为了消耗线路而完成的,但它只是跳过了价值最好的情况(抛出最坏的异常)。相反,如果确定值的格式不合适,则应使用该行以避免陷入无限循环。
else {
System.out.println(input.next() + " is not an acceptable primitive. Try again");
}
validate
布尔值仅用于基本上不跳过索引。考虑只减少 for 循环中的迭代计数器以避免额外的 if 语句,因为 for 循环会再次增加它。尽管这将重新打印 "Give me a value" 消息,所以这归结为偏好。
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;