gpt4 book ai didi

java - 在 Java 中删除元素后缩短数组长度

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:28 24 4
gpt4 key购买 nike

注意: 以下是我的作业/作业,如果你愿意,请不要回答。

我想从基本的字符串数组 (Set) 中删除/移除一个元素,我不允许使用 Collections..etc.

现在我有这个:

void remove(String newValue) {

for ( int i = 0; i < setElements.length; i++) {
if ( setElements[i] == newValue ) {
setElements[i] = "";

}
}

}

我做了我想做的,因为它从数组中删除了元素,但它并没有缩短长度。以下是输出,基本上它删除了索引为 #1 的元素。

D:\javaprojects>java SetsDemo
Enter string element to be added
A
You entered A
Set size is: 5
Member elements on index: 0 A
Member elements on index: 1 b
Member elements on index: 2 hello
Member elements on index: 3 world
Member elements on index: 4 six
Set size is: 5
Member elements on index: 0 A
Member elements on index: 1
Member elements on index: 2 hello
Member elements on index: 3 world
Member elements on index: 4 six

最佳答案

数组对象一旦创建就无法更改其长度。这是 JLS 10.2. Array Variables 的摘录:

Once an array object is created, its length never changes. To make an array variable refer to an array of different length, a reference to a different array must be assigned to the variable.

这意味着对于这个问题,您必须分配一个比原始数组短一个元素的新数组,并复制剩余的元素。

如果您需要删除索引 k 处的元素,并且原始数组有 L 个元素,那么您需要复制元素(不包括上限):

  • [0,k)[0,k)(k个元素)
  • [k+1,L)[k,L-1​​)(L-k-1个元素)。
  • 总共复制了L-1个元素

static String[] removeAt(int k, String[] arr) {
final int L = arr.length;
String[] ret = new String[L - 1];
System.arraycopy(arr, 0, ret, 0, k);
System.arraycopy(arr, k + 1, ret, k, L - k - 1);
return ret;
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
public static void main(String[] args) {
String[] arr = { "a", "b", "c", "d", "e" };
print(arr); // prints "[a, b, c, d, e]"

arr = removeAt(0, arr);
print(arr); // prints "[b, c, d, e]"

arr = removeAt(3, arr);
print(arr); // prints "[b, c, d]"

arr = removeAt(1, arr);
print(arr); // prints "[b, d]"

arr = removeAt(0, arr);
arr = removeAt(0, arr);
print(arr); // prints "[]"
}

这使用 System.arraycopy ;如果不允许,您可以随时编写自己的代码。

static void arraycopy(String[] src, int from, String[] dst, int to, int L) {
for (int i = 0; i < L; i++) {
dst[to + i] = src[from + i];
}
}

这是一个不处理 src == dst 的简单实现,但在这种情况下已经足够了。

另见


== 用于String 比较的注意事项

大多数时候,使用== 来比较String 对象是错误的。您应该改用 equals

String ha1 = new String("ha");
String ha2 = new String("ha");
System.out.println(ha1 == ha2); // prints "false"
System.out.println(ha1.equals(ha2)); // prints "true"

另见

关于java - 在 Java 中删除元素后缩短数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com