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中的数组是固定大小的。你可以做两件事:

  • 将每个元素上移一位,然后将最后一个元素设置为null
  • 创建一个新数组,然后复制它
  • 您可以将
    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他询问了最佳方法。删除它,看看您将获得多少声誉。否!!你已经知道它很丑了,那就别露出来