给定一个由n对象组成的数组,假设它是一个由字符串数组组成的数组,它具有以下值:
foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";
要删除/移除数组中等于"a"的所有字符串/对象,我必须做什么?
发布于 2008-09-21 23:30:34
如果你想要一些现成的代码,请滚动到我的"Edit3“(在剪切之后)。剩下的将留给子孙后代。
List<String> list = new ArrayList<String>(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]);
Edit3:如果您经常在同一个类中使用此代码,您可能会考虑将此代码添加到您的类中:
private static final String[] EMPTY_STRING_ARRAY = new String[0];
然后,该函数变为:
List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);
这样就不会在堆中堆满无用的空字符串数组,否则这些数组在每次调用函数时都会被new
。
cynicalman的建议(参见评论)也将有助于垃圾堆放,为了公平起见,我应该提一下:
array = list.toArray(new String[list.size()]);
我更喜欢我的方法,因为它可能更容易得到错误的显式大小(例如,在错误的列表上调用size()
)。
发布于 2014-04-21 07:44:13
Java 8中的另一种选择:
String[] filteredArray = Arrays.stream(array)
.filter(e -> !e.equals(foo)).toArray(String[]::new);
发布于 2008-09-21 23:18:07
使用Arrays.asList()
对数组进行List
,并在所有适当的元素上调用remove()
。然后调用“列表”上的toArray()
,再次返回到一个数组中。
性能不是很好,但是如果你正确地封装它,你可以在以后做一些更快的事情。
https://stackoverflow.com/questions/112503
复制相似问题