从数组中删除第一个元素的最佳方法是什么?

Nul*_*uli 77 java arrays

我有字符串数组(String[]),我需要删除第一项.我怎样才能有效地做到这一点?

jjn*_*guy 142

Java中的数组大小无法更改.因此,从技术上讲,您无法从阵列中删除任何元素.

模拟从数组中删除元素的一种方法是创建一个新的较小的数组,然后将原始数组中的所有元素复制到新的较小数组中.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);
Run Code Online (Sandbox Code Playgroud)

但是,我不建议采用上述方法.你真的应该使用一个List<String>.列表允许您添加和删除任何索引中的项目.这看起来类似于以下内容:

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意删除"ArrayList"的第一个元素是O(n). (30认同)
  • 对于数组和`ArrayList`,但不是对于`LinkedList`. (16认同)
  • 上) ?那么......在一个C阵列?删除第一个元素你只需增加指针O(1) (4认同)
  • 对于像我这样使用Java for Android的人,[`Arrays.copyOfRange()`](http://developer.android.com/reference/java/util/Arrays.html#copyOfRange%28byte [],%20int,% 20int%29)适用于API9 + (2认同)

mik*_*era 13

最简单的方法可能如下 - 您基本上需要构造一个较小的元素,然后将要保留的元素复制到正确的位置.

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您发现自己经常进行此类操作,则可能表明您应该实际使用其他类型的数据结构,例如链接列表.每次构造一个新数组是一个O(n)操作,如果你的数组很大,这可能会很昂贵.链表将为您提供O(1)删除第一个元素.

另一个想法是不删除第一个项目,而只是增加一个指向正在使用的第一个索引的整数.阵列的用户需要考虑这个偏移量,但这可能是一种有效的方法.在创建子字符串时,Java String类实际上在内部使用此方法.

  • 问题的标题清楚地表明OP**对Java 1.6及以上版本的答案感兴趣. (6认同)
  • 这在技术上不是最简单的方法.`Arrays.copyOfRange()`是. (4认同)
  • 由于他使用的是Java6,他可以使用更紧凑的Arrays.copyOfRange (4认同)

Mat*_*hen 5

你完全不能这样做,更不用说了.Java中的数组是固定大小的.你可以做的两件事是:

  1. 将每个元素向上移动一个,然后将最后一个元素设置为null.
  2. 创建一个新数组,然后复制它.

您可以使用System.arraycopy其中任何一个.这两个都是O(n),因为它们复制了除1个元素以外的所有元素.

如果您经常删除第一个元素,请考虑使用LinkedList.为方便起见LinkedList.remove,您可以使用来自Queue界面的内容.使用LinkedList,删除第一个元素是O(1).事实上,一旦你有一个ListIterator位置,删除任何元素是O(1).但是,通过索引访问任意元素是O(n).