如何在 Java 中的 int 数组中表示未初始化的值?
How to represent uninitialized values in an int array in Java?
我有一个存储 5 个整数的 int
数组。我打算将5个数字作为输入,并以排序的方式(升序)将它们放入数组中。所以基本上,我将每一步接受的值放在它应该按升序排列的位置。假设没有输入 0
,我有这个有效的代码:
System.out.println("Enter 5 integers...");
Scanner sc=new Scanner(System.in);
int[] arr = new int[5];
int c;
//assuming that no number entered is 0
for(int i=1; i<=5; i++){
c = sc.nextInt();
for(int j=0; j<5; j++){
if(arr[j] == 0){ //placing an input where there's 0
arr[j] = c;
break;
}
else if(c < arr[j]){
for(int k=4; k>j; k--)
arr[k] = arr[k-1];
arr[j] = c;
break;
}
}
}
System.out.println("The numbers in ascending order are\n"
+java.util.Arrays.toString(arr));
基本上我认为 0
是一个无效值,可以用其他数字(大概是非零的)代替它。如果用户不输入0
,我可以认为这是理所当然的。但是,如果用户输入 0
(或任何数字)会怎样?我希望能够正确放置数字,包括 0
。所以我想我可以使用其他东西来表示 uninitialized 或 empty 空格,而不是数字。我在 SO 上看到一个 post,其中有人对 double
数组有类似的问题,因此他们可以使用 Double.NaN
来表示 invalid 或 空个空格。不幸的是,JAVA 没有 Integer.NaN
,所以我无法使用这个技巧。
所以我的问题是,如何在 int 数组中表示 empty/uninitialized 空格? 可以使用类似 NaN
的东西吗?
在 Java 中,您可以使用 "classical" 过去语言的替代方法,它依赖于 "magic value" 来表示未初始化的 int
(类似于最大的或最小可能值)。
您可以使用 Integer
而不是 int
,并使用 null
作为 "uninitialised" 值:
Integer[] arr = new Integer[5];
这里arr
的每个元素都自动初始化为null
,很好
但是请注意可怕的 ==
比较引用而不是值。
一种方法是使用一些您不希望输入的默认值作为有效输入(例如,负数如 -1
或 Integer.MIN_VALUE
可以工作,如果所有有效输入为 non-negative)。如果您想使用原始整数数组(即 int[]
),这是唯一的方法。
另一种方式是使用Integer
(Integer[]
)的数组,其元素默认初始化为null
。使用包装器类型而不是原语被认为效率较低,因此需要权衡。
WHAT IF THE USER ENTERS 0?
那么您需要:
- 用负数初始化数组
- 不允许用户给出
输入负数(验证)
另一种选择可以使用包装类 Integer 而不是原语,因为这些可以很容易地证明不存在空引用...
我认为你的情况没有必要....
您可以保留一个单独的boolean
数组,长度相同,每个条目与int
数组中具有相同索引的条目表示该值是否已初始化:
int[] arr = new int[5];
boolean[] initialized = new boolean[arr.length];
int c;
//assuming that no number entered is 0
for(int i=1; i<=5; i++){
c = sc.nextInt();
for(int j=0; j<5; j++){
if(!initialized[j]){ // use boolean array to find out if already initialized
arr[j] = c;
initialized[j] = true;
break;
}
else if(c < arr[j]){
for(int k=4; k>j; k--) {
arr[k] = arr[k-1];
initialized[k] = initialized[k-1];
}
arr[j] = c;
initialized[j] = true;
break;
}
}
}
我有一个存储 5 个整数的 int
数组。我打算将5个数字作为输入,并以排序的方式(升序)将它们放入数组中。所以基本上,我将每一步接受的值放在它应该按升序排列的位置。假设没有输入 0
,我有这个有效的代码:
System.out.println("Enter 5 integers...");
Scanner sc=new Scanner(System.in);
int[] arr = new int[5];
int c;
//assuming that no number entered is 0
for(int i=1; i<=5; i++){
c = sc.nextInt();
for(int j=0; j<5; j++){
if(arr[j] == 0){ //placing an input where there's 0
arr[j] = c;
break;
}
else if(c < arr[j]){
for(int k=4; k>j; k--)
arr[k] = arr[k-1];
arr[j] = c;
break;
}
}
}
System.out.println("The numbers in ascending order are\n"
+java.util.Arrays.toString(arr));
基本上我认为 0
是一个无效值,可以用其他数字(大概是非零的)代替它。如果用户不输入0
,我可以认为这是理所当然的。但是,如果用户输入 0
(或任何数字)会怎样?我希望能够正确放置数字,包括 0
。所以我想我可以使用其他东西来表示 uninitialized 或 empty 空格,而不是数字。我在 SO 上看到一个 post,其中有人对 double
数组有类似的问题,因此他们可以使用 Double.NaN
来表示 invalid 或 空个空格。不幸的是,JAVA 没有 Integer.NaN
,所以我无法使用这个技巧。
所以我的问题是,如何在 int 数组中表示 empty/uninitialized 空格? 可以使用类似 NaN
的东西吗?
在 Java 中,您可以使用 "classical" 过去语言的替代方法,它依赖于 "magic value" 来表示未初始化的 int
(类似于最大的或最小可能值)。
您可以使用 Integer
而不是 int
,并使用 null
作为 "uninitialised" 值:
Integer[] arr = new Integer[5];
这里arr
的每个元素都自动初始化为null
,很好
但是请注意可怕的 ==
比较引用而不是值。
一种方法是使用一些您不希望输入的默认值作为有效输入(例如,负数如 -1
或 Integer.MIN_VALUE
可以工作,如果所有有效输入为 non-negative)。如果您想使用原始整数数组(即 int[]
),这是唯一的方法。
另一种方式是使用Integer
(Integer[]
)的数组,其元素默认初始化为null
。使用包装器类型而不是原语被认为效率较低,因此需要权衡。
WHAT IF THE USER ENTERS 0?
那么您需要:
- 用负数初始化数组
- 不允许用户给出 输入负数(验证)
另一种选择可以使用包装类 Integer 而不是原语,因为这些可以很容易地证明不存在空引用...
我认为你的情况没有必要....
您可以保留一个单独的boolean
数组,长度相同,每个条目与int
数组中具有相同索引的条目表示该值是否已初始化:
int[] arr = new int[5];
boolean[] initialized = new boolean[arr.length];
int c;
//assuming that no number entered is 0
for(int i=1; i<=5; i++){
c = sc.nextInt();
for(int j=0; j<5; j++){
if(!initialized[j]){ // use boolean array to find out if already initialized
arr[j] = c;
initialized[j] = true;
break;
}
else if(c < arr[j]){
for(int k=4; k>j; k--) {
arr[k] = arr[k-1];
initialized[k] = initialized[k-1];
}
arr[j] = c;
initialized[j] = true;
break;
}
}
}