Java 从数组中删除第一个元素的最佳方法是什么?
我有字符串数组(Java 从数组中删除第一个元素的最佳方法是什么?,java,arrays,Java,Arrays,我有字符串数组(string[]),需要删除第一项。我怎样才能有效地做到这一点 最简单的方法可能如下所示-您基本上需要构造一个新的数组,该数组要小一个元素,然后将要保留的元素复制到正确的位置 int n=oldArray.length-1; String[] newArray=new String[n]; System.arraycopy(oldArray,1,newArray,0,n); 请注意,如果您发现自己经常执行此类操作,这可能表明您实际上应该使用不同类型的数据结构,例如链表。每次构造
string[]
),需要删除第一项。我怎样才能有效地做到这一点 最简单的方法可能如下所示-您基本上需要构造一个新的数组,该数组要小一个元素,然后将要保留的元素复制到正确的位置
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
请注意,如果您发现自己经常执行此类操作,这可能表明您实际上应该使用不同类型的数据结构,例如链表。每次构造一个新的数组都是一个O(n)操作,如果您的数组很大,这可能会很昂贵。链表会给你O(1)删除第一个元素
另一种方法是根本不删除第一项,而是增加一个整数,该整数指向正在使用的第一个索引。阵列的用户需要考虑此偏移量,但这是一种有效的方法。Java字符串类在创建子字符串时实际上在内部使用此方法。Java中数组的大小不能更改。因此,从技术上讲,您不能从数组中删除任何元素 模拟从数组中删除元素的一种方法是创建一个新的较小数组,然后将原始数组中的所有元素复制到新的较小数组中
String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);
然而,我不建议采用上述方法。你真的应该使用列表
。列表允许您从任何索引中添加和删除项。这将类似于以下内容:
List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
List List=new ArrayList();//或LinkedList();
列表。添加(“内容”);
//添加很多东西
列表。删除(0);//删除第一项
你根本做不到,更不用说快速了。Java中的数组是固定大小的。你可以做两件事:
System.arraycopy
用于其中任何一个。这两个元素都是O(n),因为它们只复制了1个元素以外的所有元素
如果你经常删除第一个元素,考虑使用。为方便起见,您可以从
队列
界面使用。使用LinkedList
,删除第一个元素是O(1)。事实上,一旦有一个ListIterator
到达该位置,删除任何元素都是O(1)。但是,通过索引访问任意元素是O(n)。保留数组第一个“活动”元素的索引。删除(假装删除)第一个元素然后成为时间复杂度操作。另一种方法:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
总之,quick linkedlist方法:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
listllist=newlinkedlist(Arrays.asList(oldArray));
移除(0);
从技术上讲,这不是最简单的方法Arrays.copyOfRange()
是。因为他使用的是Java6,所以他可以使用更紧凑的数组。copyOfRange@Justin-当然可以,但仅当您的目标是Java 1.6或更高版本时才可以。这并不总是适用的。问题的标题清楚地表明OP对Java 1.6及以上版本的答案感兴趣。需要注意的是,删除ArrayList
的第一个元素是O(n)。@Matt,用于数组和列表。但是,对于列表来说,代码要简单得多。对于数组和ArrayList
,而不是LinkedList
。O(n)?好。。在C数组中?要删除第一个元素,您只需增加指针O(1),对于像我这样使用Java For Android的人来说,这是API9+可能的重复,而不是重复。前一个问题是关于按值删除项目;这是关于删除一个项目的索引。请,有足够声誉的人投下这个答案-这正是它所说的-丑陋!无意粗鲁,但出于可编码性的考虑,请不要发布此类内容!如果您已经在使用数组,那么最好使用Arrays.copyofRange他询问了最佳方法。删除它,看看您将获得多少声誉。否!!你已经知道它很丑了,那就别露出来