我的目标是编写一个方法,创建一个删除了奇数的数组副本。这是我的代码:
public class Evens {
static int[] evens(int[] input) {
final int n = input.length;
int[] output = new int[n];
for(int i=0;i<n;i++) {
if(input[i]%2 == 0)
output[i] = input[i];
}
return output;
}
public static void main(String[] args) {
int[] fvalues = new int[] {4,7,9,3,6,8,2};
int[] evalues = evens(fvalues);
for(int i=0;i<evalues.length;i++)
System.out.println(i+"] "+evalues[i]);
}
}
当我运行它时,它给了我一个数组的元素,其中包含原始数组的所有偶数,但奇数是奇数。我该怎么写呢,所以没有奇数就没有了?
答案 0 :(得分:1)
要删除元素,最好使用ArrayList
,因为数组无法更改其大小。如果必须使用数组,则output
数组必须短于input
。比如,如果您要删除三个元素,则output
的大小必须为input.length-3
。
在你的实现中,你实际上并没有删除元素,你只是跳过奇数,并且因为int[]
默认初始化为零,所以奇数的地方过去,数字会以零填充。
你可以这样做:
答案 1 :(得分:0)
你是否受到记忆的约束(这个家庭作业的要求)?
我会这样做(使其具有挑战性)。
这个过程虽然很复杂,但会将一些实际操作作为家庭作业的一部分。
答案 2 :(得分:0)
您的问题并不表示您是否对可以使用的算法类型有任何限制。假设您可以自由地执行任何操作,我建议您在迭代整个数组时使用List
存储偶数值,并将任何偶数复制到列表中。
您可以使用几种不同的List
实现。我会留给你做一些小腿,确定哪一个最好用。提示 - 检查JavaDocs是否实现了List
的类。
一旦你有一个包含所有偶数的完整List
,使用toArray
方法将其转换回数组是一项相当简单的练习。再次,我将留给你做一些小腿,找到如何使用该方法的例子。提示 - StackOverflow上有几个帖子使用它。
如果您仅限于可以使用的结构类型,并且只能使用数组,那么它可能需要是一个多遍过程,在该过程中,您为“偶数”数组使用单独的索引完成后,您需要将数组重新复制到适当大小的最终数组。
作为最后的建议,您可以使用Java 5+ for-each增强循环语法,并简化索引需求,而不是使用循环索引来循环遍历整个数组。例如:
for(int value : input ){
if( value % 2 == 0 )
// do something
}
这将消除至少一个令人困惑的指数。作为一个有趣的练习,看看你是否可以使用我上面提到的一些建议来编写你的函数而不需要任何循环索引。
如果有不明确的地方,请告诉我。
答案 3 :(得分:-1)
您必须考虑像int这样的基本类型数组的字段不能为空,空或类似的东西,它们必须是整数(在您的情况下为0)。
此外,数组的大小从声明时开始固定,将来也无法更改。
如果你想生成一个只包含列表偶数的数组,你说的是一个字段较少的数组,即较小的数组,所以我想很明显你必须生成一个新数组来解决你分配...
一些简单的提示:
public class Evens {
static int[] evens(int[] input) {
final int n = input.length;
int[] output = new int[n];
// consider adding some additional lines
}
// return ...
// hint: use something slightly different that your output array
}
public static void main(String[] args) {
int[] fvalues = new int[] {4,7,9,3,6,8,2};
int[] evalues = evens(fvalues);
for(int i=0;i<evalues.length;i++)
System.out.println(i+"] "+evalues[i]);
}