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

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

Java中数组的大小不能改变。 所以,从技术上讲,你不能从数组中删除任何元素。

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

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

但是 ,我不会build议上述方法。 你应该真的在使用一个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); 

请注意,如果您经常发现自己正在执行这种操作,则可能是您应该使用其他types的数据结构(例如链接列表)的标志。 每次构build一个新的数组是一个O(n)操作,如果数组很大,这可能会变得昂贵。 一个链表会给你O(1)去掉第一个元素。

另一个想法是根本不删除第一个项目,而是增加一个指向正在使用的第一个索引的整数。 数组的用户需要考虑这个偏移量,但这是一个有效的方法。 创build子string时,Java String类实际上使用了这个方法。

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

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

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

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

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

另一个丑陋的方法:

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