从数组中删除元素(Java)
是否有任何快速(和好看)的方式从Java中的数组中删除元素?
你可以使用commons lang的ArrayUtils。
array = ArrayUtils.removeElement(array, element)
commons.apache.org库:Javadocs
你的问题不是很清楚。 从你自己的答案,我可以更好地告诉你正在尝试做什么:
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); }
注:这是未经testing的。 错误检查留给练习读者(如果input或deleteMe为空,我会抛出IllegalArgumentException;在空列表input空列表没有任何意义。从数组中删除空string可能是有道理的,但我'我们也将其作为一个练习来使用;当前,如果deleteMe为null,它会在deleteMe上尝试调用equals时抛出一个NPE。
我在这里做的select:
我使用了一个LinkedList。 迭代应该一样快,如果最终删除大量元素,则避免resize,或者分配过大的列表。 您可以使用ArrayList,并将初始大小设置为input的长度。 这可能不会有太大的区别。
最好的select是使用一个集合,但如果出于某种原因,使用arraycopy
。 你可以用它来复制一个稍微不同的偏移量的同一个数组。
例如:
public void removeElement(Object[] arr, int removedIdx) { System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx); }
编辑回应评论:
这不是另一个好方法,它是唯一可以接受的方法。
要分配一个集合(创build一个新的数组),然后删除一个元素(集合将使用arraycopy),然后调用toArray(为每个删除创build一个新的第二个数组),使我们到了它不是一个优化问题,这是不好的编程。
假设你有一个数组,比如说100MB的内存。 现在你想遍历它并删除20个元素。
试一试…
我知道你假设它不会那么大,或者如果你一次删除那么多,你会以不同的方式进行编码,但我已经修复了许多代码,其中有人做出了这样的假设。
您不能从基本Java数组中移除元素。 看看各种集合和ArrayList来代替。
漂亮的解决scheme将是首先使用List而不是数组。
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
也是处理数组的好select,但它似乎不支持remove
。)
我想这个问题是在不使用Collections API的情况下寻求解决scheme。 一个使用数组来处理低性能的细节,性能很重要,或者用于松散耦合的SOA集成。 在后面,将它们转换为集合并将其传递给业务逻辑是可以的。
对于低级别的性能来说,它通常已经被for循环等的快速和肮脏的命令状态混合而混淆了。在这种情况下,在集合和数组之间来回转换是麻烦的,不可读的,甚至是资源密集型的。
顺便说一句,TopCoder,任何人? 总是那些数组参数! 所以准备在竞技场时能够处理它们。
下面是我对这个问题的解释和解决办法。 它的function与Bill K和jovovirt的不同 。 另外,它优雅地处理了元素不在数组中的情况。
希望有所帮助!
public 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; }
您可以使用ArrayUtils API以“好看的方式”将其删除。 它在数组上实现了许多操作(删除,查找,添加,包含等)。
看一看。 它使我的生活变得更简单。
您不能更改数组的长度,但可以通过复制新值并将其存储到现有索引编号来更改索引所保留的值。 1 =麦克,2 =杰夫// 10 =乔治11去1改写麦克。
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]; } }
将原始数组复制到另一个数组中,不需要删除元素。
更简单的方法是使用List,Set …并使用remove()方法。
如果调整arrays的大小不是一个兴趣,交换要删除的项目与最后一个项目。
我希望你使用java集合/ java commons集合!
使用java.util.ArrayList,您可以执行以下操作:
yourArrayList.remove(someObject); yourArrayList.add(someObject);
使用ArrayList
:
alist.remove(1); //removes the element at position 1
当然,创build另一个数组:)