所以我在高中的AP计算机科学课上,所以我不是很有经验。我有一个程序要做,这需要我从文件中读取数字,将这些数字放入一个数组,然后从数组中删除所有的0。
所以如果数字是:0,2,4,6,0,5,3,5 ...... 我需要创建一个数组:[0,2,4,6,0,5,3,5] 然后删除0:[2,4,6,5,3,5]
我必须使用数组执行此操作,并且不允许创建第二个数组来执行此操作。我已经在网上和Java API上查找了一个可以从数组中删除元素的方法,但我找不到一个。如果有人知道我可以使用的一个或指导我的方向,你的建议将不胜感激。
这是对于词的问题: 1.编写一个读取文本文件(compact.txt)的程序,并将整数存储在一个数组中。您的讲师将提供此文本文件。 2.编写一个方法 compact ,删除数组中的所有零,保持元素的顺序不变。此函数中的所有局部变量必须是标量。换句话说,您可能不会使用第二个数组来解决问题。 3.不要仅仅通过打印出数组中的非零值来解决问题。 compact 方法必须从数组中删除所有零。
答案 0 :(得分:2)
您可以尝试以下操作:由于您无法修改数组的长度,因此您可以对其进行排列,以便将所有零都放在数组的末尾并使用值-1
(这是可选的,仅用于指示它们是零。
public static void main(String[] args)
{
int[] arr = { 0, 1, 2, 0, 3, 0, 4, 0, 5, 6, 7 };
int[] arrWithoutZeros = compact(arr);
for (int i : arrWithoutZeros) {
System.out.println(i);
}
}
private static int[] compact(int[] arr)
{
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
int j = 0;
for (j = i; j < arr.length - 1; j++) {
arr[j] = arr[j + 1];
}
arr[j] = -1;
i--;
}
}
return arr;
}
<强>输出:强>
1
2
3
4
5
6
7
-1
-1
-1
-1
注意:这符合问题要求:
-1
)答案 1 :(得分:2)
我通常不喜欢做作业,但我发现这个有趣而且不可能像写的那样,所以这里有。
这很像Christian的答案,但我使用的是Integer而不是int,因此我可以将0设置为null而不是其他整数。我还避免了额外的循环,他必须在每个0上复制每个剩余的值,而是迭代数组一次,然后只迭代尾部一次以设置空值。
public class ArrayCompact {
private static Integer[] ARRAY = { 1, 3, 5, 0, 7, 9, 0, 2, 0, 4, 6, 0, 8, -1, 0 };
public static void main( String[] args ) {
printArray( compact(ARRAY ));
}
public static Integer[] compact( Integer[] ints ) {
int j = 0;
for ( int i = 0; i < ints.length; i++ ) {
if ( ints[i] != 0 ) {
ints[j++] = ints[i];
}
}
for ( int i = j; i < ints.length; i++ ) {
ints[i] = null;
}
return ints;
}
public static void printArray( Integer[] ints ) {
for ( Integer i : ints ) {
System.out.print( i + " " );
}
}
}
输出1 3 5 7 9 2 4 6 8 -1 null null null null null
从技术上讲,我猜你可能不会打印空值,因为那不是不打印0 ...
答案 2 :(得分:1)
另一个编辑:
(我认为以前的答案仍然有意义,我将其保留在最后。此编辑主要是针对作业要求的建议)
基于这个问题,紧凑逻辑将0视为“无意义”的东西,需要“删除”。因此,在“缩小”数组之后,我们并不需要某种特殊的值。只需将其保持为0即可。
除了“copy [i + 1,end] to i”方法之外,还有另一种(更简单,可能更快)的方法可以用来“删除”零。
基本上你需要的是,遍历数组。如果遇到0,则在该位置后找到第一个非零值,并将零与该非零值交换。
在psuedo代码中看起来像这样:
for (i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
for (j = i+1; j < arr.length; j++) {
if (arr[j] != 0) {
arr[i] = arr[j];
arr[j] = 0;
break;
}
}
}
}
// arr is "shrinked" here
然后你可以选择返回一个实际缩小的数组副本,或者直接返回“所谓缩小”的数组,最后输入0。
你可以想到的东西:
首先,在Java中,数组的大小是固定的,因此,不可能缩小数组的大小。因此,在不创建新数组的情况下使用较少元素的结果数组是不可能的
如果您可以将未使用的元素作为一些特殊值(例如-ve或0等)保留在最后,则数组中位置i
的删除元素实际上意味着:
将数组元素[i + 1到end]复制到位置i,并用特殊的空值替换arr [end]
e.g。 [1,3,5,7,9]
如果我想删除索引2,我需要做的是将元素3-4复制到位置2:
[1,3,5,7,9] -> [1,3,7,9,9]
^^^ ^^^
并用一些特殊值替换end元素(例如,在本例中为-1):
[1,3,7,9,9] -> [1,3,5,7,-1]
使用System.arrayCopy()
刚刚看到你问题的更新。
我的大多数答案仍然有效,这里有一些关于你的问题的额外更新:
Arrays.copyOf(oldArray, newLength)
返回“缩小”数组的新副本。这是第3点的伪代码:
int[] compact(int[] input) {
int arrSize = input.length;
int i = 0;
while (i < arrSize) {
if (input[i] == 0) {
copy input[i+1 to end] to input[i to end-1]
arrSize--;
} else {
i++;
}
}
return Arrays.copyOf(input, arrSize);
}