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


Answers:


154

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

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

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

但是,我不建议使用上述方法。您确实应该使用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

32
重要的是要注意,删除a的第一个元素ArrayList是O(n)。
马修·弗莱申

1
@Matt,用于数组和列表。但是,该代码对于列表来说更容易。
jjnguy 2010年

16
对于数组和ArrayList,但不是LinkedList
马修·弗拉申

4
上) ?好..在C数组中?除去拳头元素,你可以只是递增指针O(1)
埃尔南Eche

2
对于像我这样将Java用于Android的用户,Arrays.copyOfRange()适用于API9 +
Sdghasemi

14

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

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

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

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


4
从技术上讲,这不是最简单的方法。 Arrays.copyOfRange()是。
jjnguy 2010年

4
由于他使用的是Java6,因此可以使用更紧凑的Arrays.copyOfRange
Thilo

1
@Justin-可以,但前提是您的目标是Java 1.6或更高版本
mikera 2010年

1
真正。它并不总是适用。
jjnguy 2010年

6
该问题的标题明确指出了OP有意答案为Java 1.6及以上。
斯蒂芬·C

5

您根本做不到,更不用说快速了。Java中的数组是固定大小的。您可以做的两件事是:

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

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

如果您将经常删除第一个元素,请考虑LinkedList改为使用。为了方便起见LinkedList.remove,您可以使用Queue界面中的。使用LinkedList,删除第一个元素是O(1)。实际上,一旦您拥有ListIterator该位置,删除任何元素就是O(1)。但是,按索引访问任意元素是O(n)。


2

保留数组的第一个“活动”元素的索引。删除(假装删除)第一个元素然后成为O(1)时间复杂度操作。


0

总结一下,快速链表方法:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

-8

另一种丑陋的方法:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");

2
请具有足够声誉的人否决此答案-正是它所说的-丑陋!无意粗鲁,但出于可编码性的考虑,请勿发布此类信息!
Hack5

如果您已经在使用Arrays,则最好使用Arrays.copyOfRange
Bishal Gautam,

他要求最好的方法。
Sapphire_Brick,

删除它,然后查看您将获得多少声誉。
Sapphire_Brick,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.