如何在Java中从数组中删除一个条目,使其他条目保持顺序

3

请原谅这个笨重的标题

我想编写一个方法,从数组中删除特定的条目,但不会在数组中留下空缺。例如,如果一个字符串数组包含了以下内容:

|aa,bb,cc,dd,ee|

用户将被提示输入他们想要删除的数字,该方法将找到该条目的索引,删除该索引,然后将空条目移动到最后一个位置。因此,如果用户输入cc,则数组的内容将为:
|aa,bb,dd,ee,null|

编辑:我意识到这里忘记了一些信息。我希望删除的条目将从另一个方法传递。然后,我将使用for循环查找该条目的索引(如果未找到则不执行任何操作)。但是,我卡在如何进行删除上了。


数组在其他方法中被使用,我无法重写整个程序。这就是为什么我需要让非空条目成为第一个,因为其他方法期望的就是这样。 - Bottlecaps
在这种情况下,我不可能。 - Bottlecaps
5个回答

6
首先,我强烈建议使用ArrayList。使用它,您可以轻松地添加和删除项目,而无需更改集合的其余部分(它还具有toArray()方法)。
话虽如此,以下是仅使用数组完成此操作的示例解决方案:
public static void main(String[] args) {
    String[] arr = new String[5];
    arr[0] = "aa";
    arr[1] = "bb";
    arr[2] = "cc";
    arr[3] = "dd";
    arr[4] = "ee";

    System.out.println(Arrays.toString(arr));

    int deleteIndex = 2;        
    System.arraycopy(arr, deleteIndex + 1, arr, deleteIndex, arr.length - deleteIndex - 1);
    arr[4] = null;

    System.out.println(Arrays.toString(arr));
}

输出:

[aa, bb, cc, dd, ee]
[aa, bb, dd, ee, null]

思路是从要删除的索引+1开始,将元素向前移动一位。然后手动将最新的项设置为null,否则会重复最后一个条目。


2
我会这样做,也许更好些:
for (int i = index; i < array.length -1; i++) {
    array[i] = array[i+1];
}
array[array.length - 1] = null;

谢谢,这是一个更简单的方法。 - Bottlecaps

0
一种选择是将数组转换为列表,删除条目,然后再将其转换回数组。
ArrayList<String> aList = new ArrayList<String>(Arrays.asList(yourArray));
aList.remove(yourIndex);
return aList.toArray(new String[yourArray.length]);

作为一个测试示例
public static void main(String[] args) {

    String[] yourArray = new String[]{"FF","AA","BB"};
    for(String s : yourArray)
        System.out.println(s);

    System.out.println("");

    ArrayList<String> aList = new ArrayList<String>(Arrays.asList(yourArray));
    aList.remove(1);
    String[] r = aList.toArray(new String[yourArray.length]);

    for(String s : r)
        System.out.println(s);

}

输出

FF
AA
BB

FF
BB
null

0
为了在移除元素的同时保持内容有序,您需要将元素向数组左侧移动。最不经济且浪费的方法是使用当前大小减1的另一个数组进行初始化。然后,在循环中从您的数组中复制所有元素,但是复制用户想要删除的那个元素(跳过该索引)。

有没有更简单的方法来移动元素? - Bottlecaps
@Spork:移位是最有效的。你总是可以选择第二种需要更多空间的方法。 - Cratylus

0

您在描述中已经掌握了要点

用户将被提示输入他们想要删除的数字,该方法将找到该条目的索引,删除该索引,然后将空条目移动到最后一个位置。

由于这似乎是一项学校作业,因此不会编写实际代码,我只会添加在删除索引后其余条目的索引会发生什么?


它们应该向左移动一个位置。我不太确定如何做到这一点。 - Bottlecaps
是的,我只是想暗示一下左移时实际索引编号会发生什么变化(比如3变成2,4就会变成3,基本上每次都会减1),但上面还有其他人写的例子。 - FuriKuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接