有没有一种快速(且外观漂亮)的方法可以从Java数组中删除一个元素?
你可以使用commons lang的ArrayUtils。
array = ArrayUtils.removeElement(array, element)
removeElement
的方法。 - Atul Agrawal你的问题不是很清楚。从你自己的回答中,我能更好地了解你想要做什么:
public static String[] removeElements(String[] input, String deleteMe) {
List result = new LinkedList();
for(String item : input)
if(!deleteMe.equals(item))
result.add(item);
return result.toArray(input);
}
注意:此代码未经测试。读者需要自行添加错误检查(如果input
或deleteMe
为null,我会抛出IllegalArgumentException
;在null列表输入上返回一个空列表是没有意义的。从数组中删除null字符串可能有意义,但也留给读者练习;目前,如果deleteMe
为null,它将抛出NPE
,因为它试图调用equals方法。)
我的做法:
我使用了LinkedList
。迭代应该同样快,而且如果您删除大量元素,则可以避免任何调整大小或分配过大的列表。您也可以使用ArrayList
,并将初始大小设置为输入的长度。这可能不会产生太大的差异。
List<String>
结果。在当前编译器中执行此操作时,toArray 命令会产生类型错误(另一个解决方案是将结果强制转换)。 - user1086498最好的选择是使用集合,但如果由于某些原因无法使用,可以使用arraycopy
。您可以使用它来在略微不同的偏移量从同一数组中复制到另一个位置。
例如:
public void removeElement(Object[] arr, int removedIdx) {
System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}
回复评论后的编辑:
这不是另一种好方法,它确实是唯一可接受的方法--任何允许此功能的工具(如Java.ArrayList或Apache Utils)都将在幕后使用此方法。 另外,您确实应该使用ArrayList(或如果经常删除中间元素则使用LinkedList),因此,除非您正在做作业,否则这甚至不应该成为一个问题。
为了分配集合(创建新数组),然后删除一个元素(集合将使用arraycopy执行此操作),然后在每个删除上调用toArray(创建第二个新数组),这样就已经不是优化问题,而是糟糕的编程。
假设您有一个占用100mb内存的数组。现在,您想遍历它并删除20个元素。
试一试吧...
我知道你认为这不会那么大,或者如果你要一次删除那么多,你会以不同的方式编码它,但我修复了很多这样的代码,人们都基于这样的假设。
你无法从基本的Java数组中移除一个元素。相反,可以查看各种集合和ArrayList。
一个看起来不错的解决方案是在一开始就使用列表而不是数组。
List.remove(index)
如果你必须使用数组,那么两次调用System.arraycopy
很可能是最快的方法。
Foo[] result = new Foo[source.length - 1];
System.arraycopy(source, 0, result, 0, index);
if (source.length != index) {
System.arraycopy(source, index + 1, result, index, source.length - index - 1);
}
(Arrays.asList
也是处理数组的好方法,但似乎不支持 remove
操作。)
if (result.length != index)...
而不是 if (source.length != index)...
吗? - SteveRpublic char[] remove(char[] symbols, char c)
{
for (int i = 0; i < symbols.length; i++)
{
if (symbols[i] == c)
{
char[] copy = new char[symbols.length-1];
System.arraycopy(symbols, 0, copy, 0, i);
System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1);
return copy;
}
}
return symbols;
}
数组的长度是不可改变的,但可以通过将新值复制到现有索引编号并存储它们来改变索引所持有的值。例如:1=mike , 2=jeff // 10 = george 11 覆盖 1,使得 mike 的值被重写。
Object[] array = new Object[10];
int count = -1;
public void myFunction(String string) {
count++;
if(count == array.length) {
count = 0; // overwrite first
}
array[count] = string;
}
需要一些更多的前提条件来满足 Bill K 和 dadinn 所撰写的内容。
Object[] newArray = new Object[src.length - 1];
if (i > 0){
System.arraycopy(src, 0, newArray, 0, i);
}
if (newArray.length > i){
System.arraycopy(src, i + 1, newArray, i, newArray.length - i);
}
return newArray;
public static String[] removeElements(String[] input, String deleteMe) {
if (input != null) {
List<String> list = new ArrayList<String>(Arrays.asList(input));
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(deleteMe)) {
list.remove(i);
}
}
return list.toArray(new String[0]);
} else {
return new String[0];
}
}