Java:比较两个字符串数组并删除两个数组中存在的元素

2022-09-04 06:59:18

这主要是性能问题。我有一个字符串数组AllUids中存在的所有用户的主列表。我还有一个字符串数组EndUids中存在的所有最终日期用户的列表。

我在Java中工作,我的目标是从主列表AllUids中删除最终日期数组中存在的任何用户。我知道PHP有一个名为array_diff函数。

我很好奇Java是否有任何东西可以比较两个数组并删除两者中相似的元素。我的目标是性能,这就是为什么我问一个内置函数。我不想添加任何特殊套餐。

我想过写一个递归函数,但它似乎效率低下。两个列表中都有数千个用户。为了存在于结束日期列表中,您必须存在于 AllUids 列表中,即直到被删除。

例:

String[] AllUids = {"Joe", "Tom", "Dan", "Bill", "Hector", "Ron"};

String[] EndUids = {"Dan", "Hector", "Ron"};

我正在寻找的功能:

String[] ActiveUids = AllUids.RemoveSimilar(EndUids);

ActiveUids 看起来像这样:

{"Joe", "Tom", "Bill"}

谢谢大家,显然我可以想出循环之类的,但我不相信它会有效。这是每天在生产机器上运行的东西。


答案 1

Commons Collections有一个名为CollectionUtils的类和一个名为demoveAll的静态方法,它采用初始列表和要从该列表中删除的事物列表:

Collection removeAll(Collection collection,
                     Collection remove)

这应该可以满足您的要求,前提是您使用用户列表而不是数组。你可以非常轻松地将数组转换为列表,使用Arrays.asList()所以...

Collection ActiveUids = CollectionUtils.removeAll(Arrays.asList(AllUids), 
                                                  Arrays.asList(EndUids))

编辑:我还对共享资源集合进行了一些挖掘,并在共享资源集合中发现了以下列表Utils解决方案:

List diff = ListUtils.subtract(Arrays.asList(AllUids), Arrays.asList(EndUids));

相当整洁...


答案 2

您无法从数组中“删除”元素。您可以将它们设置为 null,但数组的大小是固定的。

你可以使用和从另一个集合中拿走一个集合,但我更喜欢使用Google馆藏库java.util.SetremoveAll

Set<String> allUids = Sets.newHashSet("Joe", "Tom", "Dan",
                                      "Bill", "Hector", "Ron");
Set<String> endUids = Sets.newHashSet("Dan", "Hector", "Ron");
Set<String> activeUids = Sets.difference(allUids, endUids);

这有一种更实用的感觉。