在 java 中,更改具有空字符的 char 数组的大小
in java, change size of char array with null character
以下代码(来自 "Cracking the code interview",来自 Gaale Laakman)显示了如何在不使用数组副本的情况下删除 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;
}
数组在创建时具有固定长度。
在示例中,他们希望通过每次迭代都重复使用相同的数组来节省一些时间。
由于不可能缩小数组(因为长度是在创建时确定的),他们使用了一种变通方法,他们在数组应该结束的地方放了一个零。当他们的循环到达零时,它知道它位于数组的概念 'end'。
数组是不可变的所以长度不会改变空space用空值填充
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
听起来像是从C或C++翻译过来的问题。在这些语言中,您在字符串的末尾使用空字符(这又是一个 char
数组)。在 Java 这不起作用;数组永远不会改变它的长度。
如果调用者知道插入了这个空字符,当然可以利用这些信息,忽略空后面的字符。他们不能使用 len
变量,因为它只存在于方法内部并且在方法 returns.
时不存在
在Java你通常会这样做:
str = Arrays.copyOf(str, tail);
这将创建一个长度正确的新数组并复制所有字符(这是代码示例旨在避免的)。
顺便说一句,如果没有找到重复项,我最后会在 str[tail] = 0;
行中得到一个 ArrayIndexOutOfBoundsException
。在这种情况下 tail
等于数组的长度,因此比最后一个元素多 1 个位置。
以下代码(来自 "Cracking the code interview",来自 Gaale Laakman)显示了如何在不使用数组副本的情况下删除 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;
}
数组在创建时具有固定长度。 在示例中,他们希望通过每次迭代都重复使用相同的数组来节省一些时间。 由于不可能缩小数组(因为长度是在创建时确定的),他们使用了一种变通方法,他们在数组应该结束的地方放了一个零。当他们的循环到达零时,它知道它位于数组的概念 'end'。
数组是不可变的所以长度不会改变空space用空值填充
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
听起来像是从C或C++翻译过来的问题。在这些语言中,您在字符串的末尾使用空字符(这又是一个 char
数组)。在 Java 这不起作用;数组永远不会改变它的长度。
如果调用者知道插入了这个空字符,当然可以利用这些信息,忽略空后面的字符。他们不能使用 len
变量,因为它只存在于方法内部并且在方法 returns.
在Java你通常会这样做:
str = Arrays.copyOf(str, tail);
这将创建一个长度正确的新数组并复制所有字符(这是代码示例旨在避免的)。
顺便说一句,如果没有找到重复项,我最后会在 str[tail] = 0;
行中得到一个 ArrayIndexOutOfBoundsException
。在这种情况下 tail
等于数组的长度,因此比最后一个元素多 1 个位置。