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

lup*_*pin 5 java arrays

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

我想删除/删除一个元素从String数组(Set)基本,我不允许使用Collections..etc.

现在我有这个:

void remove(String newValue) {

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

               }
            }

       }   
Run Code Online (Sandbox Code Playgroud)

我做了我想要的,因为它从数组中删除元素但它没有缩短长度.以下是输出,基本上它删除了索引#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
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 6

一旦创建了数组对象,就无法更改它的长度.这是JLS 10.2的摘录.数组变量:

创建数组对象后,其长度永远不会更改.要使数组变量引用不同长度的数组,必须为该变量分配对不同数组的引用.

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

如果需要删除索引处的元素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 "[]"
}
Run Code Online (Sandbox Code Playgroud)

这用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];
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的实现,无法处理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"
Run Code Online (Sandbox Code Playgroud)

也可以看看


Bal*_*usC 1

基本上,您需要创建一个新数组,其长度为旧数组的长度减1,然后需要在循环中将有效元素从旧数组复制到新数组,然后用新数组替换旧数组。

由于这是homework,因此省略了详细信息。请随意发表评论以获得更多说明。