我有一个字符串数组 (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
ArrayList
的第一个元素的时间复杂度为O(n)。 - Matthew Flaschen可能最简单的方法是如下所示——你需要构建一个新数组,该新数组比原数组少一个元素,然后将要保留的元素复制到正确的位置。
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
请注意,如果您经常执行这类操作,那么这可能表明您实际上应该使用不同类型的数据结构,例如链表。每次构造新数组都是O(n)操作,如果您的数组很大,则会变得昂贵。链表将为您提供O(1)删除第一个元素的能力。
另一种想法是根本不删除第一个项,而只是增加指向第一个正在使用的索引的整数值。数组的用户需要考虑此偏移量,但这可能是一种有效的方法。Java String类实际上在创建子字符串时内部使用此方法。
Arrays.copyOfRange()
才是。 - jjnguySystem.arraycopy
来执行这两个操作。由于它们都会复制除1个元素外的所有元素,因此这两个操作的时间复杂度均为O(n)。LinkedList
。你可以使用LinkedList.remove
来方便地删除第一个元素,该方法来自于Queue
接口。使用LinkedList
,删除第一个元素的时间复杂度为O(1)。事实上,一旦你有了指向该位置的ListIterator
,删除任何元素的时间复杂度都是O(1)。但是,通过索引访问任意元素的时间复杂度为O(n)。保留数组的第一个“活动”元素的索引。删除(假装删除)第一个元素然后变成了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(", ");
", "
,则此方法无法正常工作。 - jjnguy