我有一个存储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
。所以我认为我可以使用其他东西来代表未初始化或空空格,而不是数字。我在SO上发布了一条帖子,其中有人遇到与double
数组类似的问题,因此他们可以使用Double.NaN
来表示无效或空空格。不幸的是,JAVA没有Integer.NaN
所以我无法使用这个技巧。
所以我的问题是,如何在int数组中表示空/未初始化的空格?是否可以使用NaN
之类的内容?
答案 0 :(得分:2)
在Java中,您可以选择&#34; classic&#34;过去语言的方式,这将依赖于一个神奇的价值&#34;表示未初始化的int
(类似于最大或最小可能值)。
您可以使用Integer
而不是int
,并使用null
作为&#34;未初始化的&#34;值:
Integer[] arr = new Integer[5];
此处,arr
的每个元素都会自动初始化为null
,这很不错。
但是要注意可怕的==
比较参考而不是值。
答案 1 :(得分:1)
一种方法是使用一些您不希望输入的默认值作为有效输入(例如,-1
或Integer.MIN_VALUE
等负数可以有效有效输入是非负的)。如果你想使用一个原始整数数组(即int[]
),这是唯一的方法。
另一种方法是使用Integer
(Integer[]
)数组,默认情况下其元素初始化为null
。使用包装器类型而不是基元被认为效率较低,因此需要权衡。
答案 2 :(得分:1)
您可以保留一个长度相同的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;
}
}
}
答案 3 :(得分:0)
如果用户输入0,该怎么办?
然后你需要:
另一个选项可以使用包装器分组Integer而不是原语,因为那些可以很容易地证明对空引用...
在我看来,在你的情况下不是必要的......