如何在Java中从字符串数组中删除特定值?

14

可能重复:
从数组中删除元素(Java)

如何删除特定的字符串数组值,例如

String[] str_array = {"item1","item2","item3"};

我想要从str_array中删除"item2",请帮忙,我希望输出如下

String[] str_array = {"item1","item3"};


如果你想要长度也减少,那么你需要将其复制到一个新的数组中。如果你想要动态大小的数组,请使用ArrayList。 - nhahtdh
你需要迭代数组并比较你的值。 - Hardik Mishra
我知道从ArrayList中删除值我们使用"list.remove()",但我需要知道是否有任何属性可以删除字符串数组中的字符串。 - Vicky
@Vicky:没有这样的属性。 - Hardik Mishra
这些方法数组本身没有。如果你想用一行代码来实现,你应该遵循PeterLawrey的建议:https://dev59.com/rnRB5IYBdhLWcg3wXmRI#644719 - Luiggi Mendoza
3个回答

49

我会按照如下方式做:

String[] str_array = {"item1","item2","item3"};
List<String> list = new ArrayList<String>(Arrays.asList(str_array));
list.remove("item2");
str_array = list.toArray(new String[0]);

3
与使用System.arraycopy相比,效率较低,特别是在多次使用时。 - FThompson
@Vulcan,感谢您的评论,您介意更新我的答案以展示如何在此处使用System.arraycopy吗?谢谢。 - Vikdor
@Vikdor 我会发布一个使用它的答案,稍等一下。 - FThompson
@Vikdor 抱歉耽搁了,有点分心了。不过我已经发布了答案。 - FThompson
这真的很有用... 这个答案帮了我很多 - Afrah_Rahman

7
如果你必须使用数组,System.arraycopy 是最高效、可扩展的解决方案。但是,如果你需要多次从数组中删除一个元素,你应该使用 List 的实现而不是数组。
下面的代码利用 System.arraycopy 来实现所需的效果。
public static Object[] remove(Object[] array, Object element) {
    if (array.length > 0) {
        int index = -1;
        for (int i = 0; i < array.length; i++) {
            if (array[i].equals(element)) {
                index = i;
                break;
            }
        }
        if (index >= 0) {
            Object[] copy = (Object[]) Array.newInstance(array.getClass()
                    .getComponentType(), array.length - 1);
            if (copy.length > 0) {
                System.arraycopy(array, 0, copy, 0, index);
                System.arraycopy(array, index + 1, copy, index, copy.length - index);
            }
            return copy;
        }
    }
    return array;
}

此外,如果你知道你的数组仅包含Comparable对象,你可以通过使用Arrays.sort将其排序以提高方法效率,然后再通过修改使用Arrays.binarySearch而非for循环来查找索引的remove方法来进一步提高效率。这将把该方法的效率从O(n)提高到O(nlogn)。


1
当你想要一个String[]时,得到一个Object[]返回并不好。Array.newInstance允许你构建任意类型的数组。 - gustafc
@gustafc 说得好。缺点是执行时间稍微慢了些。 - FThompson
值得注意的是,O(n log n) 并不一定比 O(n) 更快,因为大 O 只告诉你处理 n+1 个元素的成本与使用相同算法处理 n 个元素的成本相比如何。排序所带来的常数成本可能会超过二分查找的好处(特别是对于小数组而言)。 - gustafc
Array.newInstance 可能会慢一些,但并不一定如此。在大多数情况下,HotSpot 可以优化它,使其与常规数组实例化一样快。无论哪种方式,您最终都会得到一个更强大和正确的程序。 - gustafc
啊,很好。我刚刚进行了一个小测试,新建Object[x]的平均时间为0.40毫秒,Array.newInstance的平均时间为0.45毫秒,稍微慢了一点点,但差距非常小,可以说是无关紧要,甚至可能不存在。 - FThompson
2
确实。而且,如果代码的那一部分成为瓶颈,那么数组可能不是您程序中最适合的数据结构。 - gustafc

4
另一个选择是将数组复制到另一个数组中,然后移除项目。
 public static String[] removeItemFromArray(String[] input, String item) {
    if (input == null) {
        return null;
    } else if (input.length <= 0) {
        return input;
    } else {
        String[] output = new String[input.length - 1];
        int count = 0;
        for (String i : input) {
            if (!i.equals(item)) {
                output[count++] = i;
            }
        }
        return output;
    }
}

注意,这将从输入数组中删除所有 item 实例,而不仅仅是一个。 - FThompson

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