刪除陣列中一個或者多個連續的元素

dragonwang發表於2015-07-02

本文允許轉載,但請標明出處:http://blog.csdn.net/wanghantong/article/details/46730591, 版權所有


參考StringBuffer的底層原始碼實現:

public final class StringBuffer  extends AbstractStringBuilder implements java.io.Serializable,
CharSequence

<span style="font-size:14px;">char[] value;
int count;
public AbstractStringBuilder delete(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            end = count;
        if (start > end)
            throw new StringIndexOutOfBoundsException();
        int len = end - start;
        if (len > 0) {
            System.arraycopy(value, start+len, value, start, count-end);
            count -= len;
        }
        return this;
    }</span>

本文允許轉載,但請標明出處:http://blog.csdn.net/wanghantong/article/details/46730591,
版權所有

策略解析:
<span style="font-size:14px;">Test  System.arraycopy()方法:
String[] array1 = { "1", "2", "3", "4", "5" };
//System.arraycopy(value, start+len, value, start, count-end); 
//System.arraycopy(src, srcPos, dest, destPos, length);
System.arraycopy(array1, 4, array1, 3,1);
//從索引為4的元素開始,替換了從起始索引為3的元素,替換長度為1
printArray(array1);//1 2 3 5 5</span>


本文允許轉載,但請標明出處:http://blog.csdn.net/wanghantong/article/details/46730591, 版權所有

分析count -= len;
陣列元素替換之後,就變成12355,
count = 源陣列的元素個數
len = 我們要替換的末索引-始索引 = (期望被刪除的元素的個數)
count -= len; // 表示陣列被刪除後,長度減少了len個。所以count -= len;
12355 取 4個長度。。就是1235,那麼看結果,4已經被刪除掉了。。。

再說System.arraycopy(src,
srcPos, dest, destPos, length);這個方法
 public
static native void arraycopy(Object src,  int  srcPos,
 
                                      Object dest, int destPos,
 
                                      int length);
看見native了,不用多講了,再底層就是C++了。API解讀完了。

刪除元素,就是把即將被刪除元素的後邊的元素往前挪了END – START個位置。然後按長度取就可以了。



相關文章