从数组中删除第一个元素的最佳方法是什么?
我有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中的数组是固定的大小。 你可以做的两件事是:
- 将每个元素向上移动一个,然后将最后一个元素设置为null。
- 创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(", ");