簡體   English   中英

在Java中,使用null字符更改char數組的大小

[英]in java, change size of char array with null character

下面的代碼(摘自Gaale Laakman的“ Cracking the代碼訪談”)展示了如何在不使用數組副本的情況下刪除char數組中的重復字符,從而避免了額外的內存使用。 它用偏移量重寫第一個數組中的最終字符。 由於最后一個數組小於前一個數組,因此在最后一個字符之后的位置設置一個空字符,好像該數組在此處停止:

    str[tail] = 0;

我想知道這樣做是否會更改數組的“長度”變量。 如果沒有,我不明白為什么這個例子可行。 還是這只是一個示例,我們將檢查空字符在哪里查找數組的長度,而不使用有問題的length變量?

這是完整的代碼:

    public static void removeDuplicates(char[] str) {
        if (str == null) return;
        int len = str.length;
        if (len < 2) return;
        int tail = 1;
        for (int i = 1; i < len; ++i) {
            int j;
            for (j = 0; j < tail; ++j) {
                if (str[i] == str[j]) break;
            }
            if (j == tail) {
                str[tail] = str[i];
                ++tail;
            }
        }
        str[tail] = 0;
    }

聽起來好像是從C或C ++翻譯過來的問題。 在這些語言中,您在字符串的末尾使用一個空字符(而該char又是一個char數組)。 在Java中,此方法無效。 數組永遠不會改變其長度。

如果呼叫者知道已插入此空字符,則他們當然可以使用該信息,並忽略該空字符之后的字符。 他們不能使用len變量,因為它僅存在於方法內部,並且在方法返回時不存在。

在Java中,您通常會執行以下操作:

str = Arrays.copyOf(str, tail);

這將創建一個正確長度的新數組並復制所有字符(這是代碼示例旨在避免的字符)。

順便說一句,我在str[tail] = 0;行中得到了ArrayIndexOutOfBoundsException str[tail] = 0; 最后如果沒有發現重復。 在這種情況下, tail等於數組的長度,因此比最后一個元素高1個位置。

數組在創建時具有固定的長度。 在該示例中,他們希望通過每次迭代都重復使用同一數組來節省時間。 由於無法縮小數組(因為長度是在創建時確定的),因此他們會變通,將零放在數組應終止的位置。 當它們的循環達到零時,它知道它在數組的概念“末端”。

數組是不可變的,因此長度不會改變,空白區域會填充空值

public class MainClass {

public static void main(String[] args) {
char[] org={'a','b','b','c'};
System.out.println(org.length);
System.out.println(org);
removeDuplicate(org);
System.out.println(org.length);
   System.out.println(org);

}
public static void removeDuplicate(char[]str){
if(str==null)return;
int len=str.length;
if(len<2)return;
int tail=1;
for(int i=1;i<len;++i){
    int j;
    for(j=0;j<tail;++j){
        if(str[i]==str[j])break;
    }
    if(j==tail){
    str[tail]=str[i];
    ++tail;
    }
}
   str[tail]=0;
  }
 }

**Results**
   4
  abbc
   4
  abc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM