如何处理int和Integer之间的数组元素

时间:2010-06-17 03:39:30

标签: java arrays

首先,这是很长的帖子,所以如果你需要澄清,请告诉我。

我是Java新手,难以决定是否应该使用int []或Integer []。 我写了一个函数,从int []数组中找到odd_number。

public int[] find_odd(int[] arr) {
        int[] result = new int[arr.length];
        for(int i=0; i<arr.length; i++) {
            if(arr[i] % 2 != 0) {
                //System.out.println(arr[i]);
                result[i] = arr[i];
            }
        }
        return result;
    }

然后,当我传递包含一些整数的int []数组时,如下所示:

int[] myArray = {-1, 0, 1, 2, 3};
int[] result = find_odd(myArray);

数组“result”包含:

0,-1,0,1,0,3

因为在Java中你必须首先定义数组的大小,而空int []数组元素是0而不是null。因此,当我想测试find_odd()函数并期望数组只有奇数(它所做的)时,它会抛出错误,因为该数组还包含0表示“空单元格”,如上所示。

我的测试代码:

public void testFindOddPassValidIntArray() {
        int[] arr = {-2, -1, 0, 1, 3};
        int[] result = findOddObj.find_odd(arr);

        //check if return array only contain odd number
        for(int i=0; i<result.length; i++) {
            if(result[i] != null) {
                assert is_odd(result[i]) : result[i];
            }

        }
    }

所以,我的问题是我应该使用int []数组并在我的测试中添加0元素的检查,如:

if(result[i] != 0) {
  assert is_odd(result[i] : result[i]
}

但是在这种情况下,如果find_odd()函数被破坏并且由于计算错误而返回0,我无法捕获它,因为我的测试代码只假设0是空单元格。

或者我应该使用默认为null的Integer []数组吗?人们如何处理这种情况?

5 个答案:

答案 0 :(得分:5)

我的建议一般你不应该使用数组。您应该使用List代替。那时,我们会为您做出选择。您必须使用Integer而不是int,因为Java泛型不支持基本类型(不像C#)。

public List<Integer> findOdd(List<Integer> in) {
  List<Integer> ret = new ArrayList<Integer>();
  for (Integer i : in) {
    if (i % 2 == 1) {
      ret.add(i);
    }
  }
  return ret;
}

由于您是Java新手,因此可能会为您介绍一些新概念。

Java Collections与数组没有相同的限制。例如,您创建它时不必声明ArrayList的大小。数组分配被这个特定的类抽象掉。

现在所有这些假设您不希望结果数组与输入数组的大小相同。这有正当理由(例如,在进行矢量/矩阵数学时)。处理此类事情的两种方法是使用Integer(因此您可以将null用于空值,但这需要您测试null)或使用sentinel值(例如Integer.MAX_VALUE)。

答案 1 :(得分:2)

两件事。

首先,(0%2 == 0)为真,所以如果'arr'中存在0,它将输出为奇数。 你会想要这样的东西:

if(arr[i] != 0 && arr[i] % 2 != 0) 

其次,您不希望返回相同大小的数组,因此您更适合使用List&lt; Integer&gt;因为它可以在运行时增长到你需要的大小,但仅仅因为你使用的是Integer并不意味着你应该用NULL填充你的列表,而是如果它没有通过你的测试,你就不应该向List添加任何东西“奇”。

答案 2 :(得分:1)

如果在你的场景中,数组有“空”单元格是有效的,那么你需要某种方式来表示它们。具有Integer值的null数组肯定是更明显和清晰的方式。

在极少数情况下,你知道“非空”单元格永远不会包含0并且性能至关重要,你可以使用0表示“空” - 但在我这样做之前我会三思而后行。

答案 3 :(得分:1)

您可以使用Integer[]数组而不是int[]数组,这样您就可以使用null

这适用于int是内置基元类型,而Integer则是对内存中某个整数的引用。 Java将通过装箱和拆箱在两者之间进行静默转换。

缺点是由于装箱和拆箱会导致性能下降 - 但除非算法处理大量数据或实时,否则您无需担心这一点。

答案 4 :(得分:1)

方法public int [] find_odd(int [] arr)应该只返回奇数值,不应该返回“空”空格。这将解决您的问题,因为没有空的空格要检查。

public int[] find_odd(int[] arr) { 
    int[] result = new int[arr.length]; 
    int results = 0;
    for(int i=0; i<arr.length; i++)
        if(arr[i] % 2 != 0) 
            result[results++] = arr[i]; 
    int[] result2 = new int[results];
    System.arraycopy(result, 0, result2, 0, results);
    return result2; 
} 

数组“result”包含:

-1, 1, 3

使用int []的替代方法是GNU Trove的TintArrayList。它具有int []的大部分效率和ArrayList

的大部分便利性