首先,这是很长的帖子,所以如果你需要澄清,请告诉我。
我是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 []数组吗?人们如何处理这种情况?
答案 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
的大部分便利性