[英]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.