当前位置:  开发笔记 > 编程语言 > 正文

如何从Java中删除数组中的对象?

如何解决《如何从Java中删除数组中的对象?》经验,为你挑选了6个好方法。

给定n个对象的数组,假设它是一个字符串数组,它具有以下值:

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

如何删除/删除数组中等于"a"的所有字符串/对象?



1> Chris Jester..:

[如果你想要一些现成的代码,请滚动到我的"Edit3"(剪辑后).剩下的就是后人.]

要充实Dustman的想法:

List list = new ArrayList(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

编辑:我现在正在使用Arrays.asList而不是Collections.singleton:singleton仅限于一个条目,而该asList方法允许您添加其他字符串以便稍后过滤:Arrays.asList("a", "b", "c").

Edit2:上面的方法保留了相同的数组(所以数组的长度仍然相同); 最后一个元素设置为null.如果您想要一个完全符合要求的数组,请改用:

array = list.toArray(new String[0]);

编辑3:如果您经常在同一个班级中使用此代码,您可以考虑将其添加到您的班级:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

然后功能变为:

List list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

然后,这将停止使用无用的空字符串数组乱丢您的堆,否则new每次调用函数时都会对其进行编辑.

愤世嫉俗者的建议(见评论)也将有助于堆乱扔垃圾,为了公平起见,我应该提一下:

array = list.toArray(new String[list.size()]);

我更喜欢我的方法,因为可能更容易使显式大小错误(例如,调用size()错误的列表).


为什么不使用list.toArray(new String [list.size()])而不是new String [0],因为如果大小正确,代码将使用新数组?

2> Vitalii Fedo..:

Java 8中的替代方案:

String[] filteredArray = Arrays.stream(array)
    .filter(e -> !e.equals(foo)).toArray(String[]::new);


虽然整洁,但与System.arraycopy相比,这将是非常低效的.可能不应该在实际代码中执行此操作.

3> Dustman..:

List用数组制作一个数组Arrays.asList(),并调用remove()所有适当的元素.然后调用toArray()'List'再次返回一个数组.

性能不是很好,但是如果你正确地封装它,你总是可以在以后更快地做一些事情.


这有什么关系?@Chris指出由`Arrays.asList()`生成的列表不支持`remove()`.这个答案完全无效吗?看起来好像有些评论被删除了,所以我不知道是否讨论过这个问题.
你的评论:没关系,你很快就会习惯它.:-)我发布了我的帖子,因为我不想让读者知道可以从Arrays.asList()的结果中删除元素(这是一个不可变的列表),所以我认为一个例子可以解决这个问题.:-)

4> 小智..:

你可以随时做:

int i, j;
for (i = j = 0; j < foo.length; ++j)
  if (!"a".equals(foo[j])) foo[i++] = foo[j];
foo = Arrays.copyOf(foo, i);



5> bugs_..:

您可以使用外部库:

org.apache.commons.lang.ArrayUtils.remove(java.lang.Object[] array, int index)

它是在项目Apache Commons Lang http://commons.apache.org/lang/



6> 小智..:

见下面的代码

ArrayList a = new ArrayList<>(Arrays.asList(strings));
a.remove(i);
strings = new String[a.size()];
a.toArray(strings);

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有