给定n个对象的数组,假设它是一个字符串数组,它具有以下值:
foo[0] = "a"; foo[1] = "cc"; foo[2] = "a"; foo[3] = "dd";
如何删除/删除数组中等于"a"的所有字符串/对象?
[如果你想要一些现成的代码,请滚动到我的"Edit3"(剪辑后).剩下的就是后人.]
要充实Dustman的想法:
Listlist = 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];
然后功能变为:
Listlist = 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()
错误的列表).
Java 8中的替代方案:
String[] filteredArray = Arrays.stream(array) .filter(e -> !e.equals(foo)).toArray(String[]::new);
List
用数组制作一个数组Arrays.asList()
,并调用remove()
所有适当的元素.然后调用toArray()
'List'再次返回一个数组.
性能不是很好,但是如果你正确地封装它,你总是可以在以后更快地做一些事情.
你可以随时做:
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);
您可以使用外部库:
org.apache.commons.lang.ArrayUtils.remove(java.lang.Object[] array, int index)
它是在项目Apache Commons Lang http://commons.apache.org/lang/
见下面的代码
ArrayLista = new ArrayList<>(Arrays.asList(strings)); a.remove(i); strings = new String[a.size()]; a.toArray(strings);