Java 中从数组中删除元素

培训教学 潘老师 7个月前 (09-22) 185 ℃ (0) 扫码查看

学习如何通过索引位置和项值在Java中删除数组项。

请注意,理论上,我们可以以两种方式删除数组项:

  • 创建一个新数组,并将原始数组中除了要删除的索引或项以外的所有项复制到新数组中。这会创建一个新数组,因此对于需要大量内存的大型数组可能不太适合。在这种技术中,原始数组不受影响。
  • 覆盖所有数组索引位置的值,从要删除的索引开始到数组的末尾,用存储在其下一个索引中的值。这有效地删除了指定索引处的项。由于不创建新数组,因此内存效率更高。请注意,我们可能希望将最后一个索引位置的值替换为null,以防止在数组的末尾重复项。

1.使用 ArrayUtils 删除数组项

ArrayUtils 类来自Apache Commons Lang库,提供了许多实用的方法来处理Java中的数组。

对于删除数组项,它提供了以下方法。所有方法都返回一个新数组,原始数组不会被修改。在删除项后,所有后续数组元素都会向左移动。

  • remove(array, index) – 从指定数组中删除指定索引处的元素。如果索引超出范围,它会抛出 IndexOutOfBoundsException 异常。
  • removeAll(array, indices…) – 从指定数组中删除指定索引处的所有元素。
  • removeElement(array, item) – 从指定数组中删除指定项的第一个出现。如果数组不包含这样的元素,则不会从数组中删除任何元素。
  • removeElements(array, items…) – 从指定数组中删除指定项的出现次数,以指定的数量。对于要删除的元素数量大于原始数组中包含的数量的情况,除了删除现有匹配项外,不会发生任何更改。
  • removeAllOccurrences(array, item) – 从指定数组中删除指定项的所有出现。如果数组不包含这样的元素,则不会从数组中删除任何元素。

让我们看一些如何使用这些API的示例。

Java程序以删除索引位置5处的元素。

Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Integer[] reducedArray = ArrayUtils.remove(originalArray, 5);
//[0, 1, 2, 3, 4, 6, 7, 8, 9]

Java程序删除索引位置5、6和7处的元素。

Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Integer[] reducedArray = ArrayUtils.removeAll(originalArray, 5, 6, 7);
//[0, 1, 2, 3, 4, 8, 9]

Java 程序从数组中删除值为 7 的元素。

Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Integer[] reducedArray = ArrayUtils.removeElement(originalArray, 7);
//[0, 1, 2, 3, 4, 5, 6, 8, 9]

Java程序从数组中删除多个元素

Integer[] originalArray = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4};
Integer[] reducedArray = ArrayUtils.removeElements(originalArray, 1, 2, 3);
//[1, 2, 3, 3, 4, 4, 4]
Integer[] reducedArray = ArrayUtils.removeElements(originalArray, 1, 1, 2, 2, 3);
//[3, 3, 4, 4, 4]

Java 程序,用于从数组中删除所有指定值的元素。

Integer[] originalArray = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4};
Integer[] reducedArray = ArrayUtils.removeAllOccurrences(originalArray, 4);
//[1, 1, 2, 2, 3, 3, 3]

2.使用Collections移除数组项

如果内存对较小的列表不是限制因素,我们可以考虑使用原生的Collection API来编写自定义逻辑以移除数组项。

最直接的方法是将数组转换为List,因为List支持一系列易于使用的方法,用于处理简单的用例,比如:

  • remove(index) – 移除列表中指定索引的项。
  • remove(item) – 从数组中移除指定的项。
  • removeAll(item) – 从数组中移除所有指定项的出现。
  • removeIf(predicate) – 移除与指定条件匹配的项。
Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<Integer> tempList = new ArrayList<>(Arrays.asList(originalArray));
tempList.remove(7);
tempList.removeAll(5);
Integer[] reducedArray = tempList.toArray(new Integer[0]);

3.在for循环中移除并移动项

假设我们处于一个内存敏感的高性能应用程序中,无法承担创建一个新数组的成本。在这种情况下,我们可以遍历数组的项,移除指定的项或索引,并将后续的项向左移动。

在这个过程中,最后一项不会移动,最后和倒数第二个元素将会重复。如果需要,我们可以将最后一项替换为null来修复这种行为。

Integer[] originalArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
removeIndexAndShift(originalArray, 6);
//[0, 1, 2, 3, 4, 5, 7, 8, 9, null]
removeIndexAndShift(originalArray, 2);
//[0, 1, 3, 4, 5, 7, 8, 9, null, null]
static <T> void removeIndexAndShift(T[] array, int indexToRemove) {
    for (int i = indexToRemove; i < array.length - 1; i++) {
          array[i] = array[i + 1];
    }
    //optionally we can set the last element to null
    array[array.length - 1] = null;
}

4.结论

这个简短的教程教会了我们如何使用不同的技巧从数组中移除元素。大多数技巧都会创建一个新的数组,但如果需要的话,我们也可以使用自定义代码对原始数组进行修改。

对于较短的数组,我们可以使用内置的API,比如CollectionsArrayUtils。对于较大的数组,我们需要非常谨慎地考虑,然后选择上面提到的任何一种解决方案。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9193.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】