如何在Java的int数组中表示未初始化的值?
我有一个如何在Java的int数组中表示未初始化的值?,java,arrays,nan,Java,Arrays,Nan,我有一个int数组,它存储5个整数。我打算将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(in
int
数组,它存储5个整数。我打算将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));
System.out.println(“输入5个整数…”);
扫描仪sc=新的扫描仪(System.in);
int[]arr=新的int[5];
INTC;
//假设没有输入数字是0
对于(inti=1;i在Java中,您有一种替代过去语言的“经典”方式的方法,这种方法依赖于“神奇值”来表示未初始化的int
(类似于最大或最小的可能值)
您可以使用Integer
,而不是int
,并对“未初始化”值使用null
:
Integer[]arr=新整数[5];
这里,arr
的每个元素自动初始化为null
,这很好
但是一定要注意比较引用而不是值的可怕的==
。在Java中,您有一种替代过去语言的“经典”方式,它依赖“神奇值”来表示未初始化的int
(类似于最大或最小的可能值)
您可以使用Integer
,而不是int
,并对“未初始化”值使用null
:
Integer[]arr=新整数[5];
这里,arr
的每个元素自动初始化为null
,这很好
但是要注意比较引用而不是值的可怕的==
。一种方法是使用一些默认值,您不希望输入为有效输入(例如,如果所有有效输入都是非负的,负数如-1
或整数。最小值
可以工作)。如果要使用基本整数数组(即int[]
),这是唯一的方法
另一种方法是使用Integer
(Integer[]
)数组,默认情况下,其元素初始化为null
。使用包装类型而不是原语被认为效率较低,因此存在折衷。一种方法是使用一些默认值,您不希望将其作为有效输入输入(例如,-1
或Integer.MIN_VALUE
等负数可以在所有有效输入均为非负数的情况下工作)。如果要使用基本整数数组(即int[]
),这是唯一的方法
另一种方法是使用Integer
(Integer[]
)数组,默认情况下,其元素初始化为null
。使用包装类型而不是原语被认为效率较低,因此存在折衷
如果用户输入0怎么办?
然后你需要:
- 使用负数初始化数组
- 不允许用户作为用户提供
输入负数(验证)
另一个选项是使用包装类整数而不是原语,因为它们可以很容易地证明为空引用
依我看,你的情况没有必要
如果用户输入0怎么办?
然后你需要:
- 使用负数初始化数组
- 不允许用户作为用户提供
输入负数(验证)
另一个选项是使用包装类整数而不是原语,因为它们可以很容易地证明为空引用
在我看来,在您的情况下没有必要……您可以保留一个长度相同的布尔值的单独数组,并且每个具有与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;
}
}
}
int[]arr=newint[5];
布尔值[]已初始化=新布尔值[arr.length];
INTC;
//假设没有输入数字是0
对于(int i=1;i您可以保留一个长度相同的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;
}
}
}
int[]arr=newint[5];
布尔值[]已初始化=新布尔值[arr.length];
INTC;
//假设没有输入数字是0
对于(int i=1;i为什么不使用整数数组?可以在那里使用null。另一个选项是创建一个包装类,将您的值包装为status,但这个解决方案听起来很简单ugly@pbielicki虽然我没有想到这一点,但我正在考虑在这种情况下是否可以使用Double.NaN
,因此不必这样做对基元类型使用包装类。为什么不使用整数数组?可以在那里使用null。其他选项是创建一个包装类,用状态包装您的值,但此解决方案听起来更像ugly@pbielicki虽然我没有想到这一点,但我正在考虑是否可以使用Double.NaN
在这种情况下,不必为基元类型使用包装器类。我假设用户可以输入任何东西,也可以是负数,我不能用数字表示未初始化的值。我假设用户可以输入任何东西,也可以是负数,我不能用数字表示未初始化的值。所以这是c中唯一的方法整数的ase,对吗?在Double
数组中不能像使用Double.NaN
那样,对吗?即使在-128到+127范围内,如果数字是使用自动装箱或integer.valueOf()创建的,则只能使用=
。但是如果其中一个整数是使用新整数(123)创建的
那么,这一个不等于=
到Integer.valueOf(123)
,例如。是的,这是一个很好的观点。我删除了我的最后一句话。Less通常是m