繁体   English   中英

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

[英]What is the best way to remove the first element from an array?

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

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

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

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

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

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

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

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

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

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

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

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

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

另一种丑陋的方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM