如何在Java中的int数组中表示未初始化的值?

时间:2017-02-01 13:05:06

标签: java arrays nan

我有一个存储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之类的内容?

4 个答案:

答案 0 :(得分:2)

在Java中,您可以选择&#34; classic&#34;过去语言的方式,这将依赖于一个神奇的价值&#34;表示未初始化的int(类似于最大或最小可能值)。

您可以使用Integer而不是int,并使用null作为&#34;未初始化的&#34;值:

Integer[] arr = new Integer[5];

此处,arr的每个元素都会自动初始化为null,这很不错。

但是要注意可怕的==比较参考而不是值。

答案 1 :(得分:1)

一种方法是使用一些您不希望输入的默认值作为有效输入(例如,-1Integer.MIN_VALUE等负数可以有效有效输入是非负的)。如果你想使用一个原始整数数组(即int[]),这是唯一的方法。

另一种方法是使用IntegerInteger[])数组,默认情况下其元素初始化为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而不是原语,因为那些可以很容易地证明对空引用...

在我看来,在你的情况下不是必要的......