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


问题内容

这主要是一个性能问题。我有一个字符串数组AllUids中现有的所有用户的主列表。我还列出了String数组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"}

谢谢大家,显然我可以提出这样的循环,但是我不确定这样做会有效。这是每天都会在生产机器上运行的东西。


问题答案:

Commons
Collections
有一个称为CollectionUtils的类和一个名为removeAll的静态方法,该方法带有一个初始列表和要从该列表中删除的东西列表:

Collection removeAll(Collection collection,
                     Collection remove)

如果您使用用户列表而不是数组,那应该可以实现您想要的功能。您可以使用Arrays.asList()非常容易地将数组转换为列表,以便…

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

编辑:我也对此进行了一些研究,并在Commons Collections中使用ListUtils找到了以下解决方案:

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

漂亮整齐…