Java:从数组中删除所有特定项的实例

3

假设我创建了一个数组,并将值设置为以下内容:

double[] exampleArray = {10.0, 3.0, 0.0, 0.0, 0.0};

如何从数组中删除所有0.0,只留下10.03.0,并将数组长度缩短为2?

这个网站上的其他问题涉及HashSetsCollections。是否有一种方法可以在不导入其他内容的情况下完成?


只需创建一个新数组,迭代旧数组并将所需的项推入新数组即可。 - yelliver
除非您想广泛使用 System.arraycopy,否则导入任何其他内容都会使这对您来说更加简单。 - Makoto
@Makoto 是的,但我认为用户Yelliver的方法似乎是可行的。 - Registered User
考虑到你不能在没有预定义大小的情况下向数组中添加元素,因此这不可行。 - Makoto
@Makoto 我明白了。所以要删除所有的0,我们必须创建一个新列表。如果我想让它从命令行读取并删除任何列表中的所有0,该怎么办? - Registered User
显示剩余2条评论
3个回答

7

这里有一个使用流的一行代码可以完成此任务:

exampleArray = Arrays.stream(exampleArray).filter(d -> d != 0.0).toArray();

2

这只是一个使用int数据类型的示例。可以根据您的需求进行更改。

解释: j是计数器变量,用于通过从创建新数组中排除非零索引并将所有非零索引复制到新数组来调整newArray的大小。我们这样做是因为在java中,数组长度是不可变的。因此,在尝试调整数组大小时,必须创建一个新数组并进行复制。当需要大小可变性时,使用其他数据结构的好处就在于此。

int j = 0;
for( int i=0; i<array.length; i++ ){
    if (array[i] != 0)
        array[j++] = array[i];
}
int [] newArray = new int[j];
System.arraycopy( array, 0, newArray, 0, j );

你应该解释一下这段代码在做什么。此外,解释一下为什么要使用 int[] 而不是 double[] - Makoto

1
希望这段代码能够帮到您。这是最基础的方法(不是最好的):
double[] exampleArray = {10.0, 3.0, 0.0, 0.0, 0.0}; 
double numberToErase = 0.0; //This could be a parameter
int newArraySize = 0;

//Get the fixed size of the new Array
for (double n : exampleArray) {
    if (n != numberToErase) {
        newArraySize++;
    }
}

//Create the new array 
double[] newArray = new double[newArraySize];
int newArrayCurrentIndex = 0;
for (double n : exampleArray) {
    if (n != numberToErase) {
        newArray[newArrayCurrentIndex++] = n;
    }
}

//Check the result
for (double n : newArray) {
    System.out.println("Number: " + n);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接