我有两个列表,让我们将它们称为列表A和列表B.这两个列表都包含名称,并且没有重复项(它们是唯一值)。列表B中的每个名称都可以在列表A中找到。我想查找列表B中缺少的名称,以便将缺少的名称插入到数据库中。基本示例:
List<String> a = new ArrayList<>(Arrays.asList("name1", "name2", "name3", "name4","name5","name6"));
List<String> b = new ArrayList<>(Arrays.asList("name1", "name2", "name4", "name6"));
a.removeAll(b);
//iterate through and insert into my database here
从我搜索过的removeAll()
似乎是一个回答。就我而言,我正在处理各种可能的数量。它可以是500到50,000个名字之间的任何地方。 removeAll()
会满足于此吗?我已经读过removeAll()
是O(n ^ 2),这可能不是一个非常小的数量的问题,但是数量较大,听起来可能是这样。我想象它还取决于用户对什么时候被认为是问题的耐心?最后,我想知道是否有更好的方法可以做到这一点,而不会增加大量的复杂性,因为我非常欣赏简单(在某种程度上)。
答案 0 :(得分:1)
如果你对这些列表做的唯一事情是将它们插入数据库,你就不应该真正关心元素的顺序。您可以使用HashSet
而不是ArrayList
来获得O(n)性能而不是O(n 2 )。作为副作用,使用Set
可确保a
和b
中的值确实是唯一的。
答案 1 :(得分:0)
50000是非常少量的数据。除非你反复这样做,否则任何合理的东西都可能足够好。
实现此目的的一种方法:
List<String> a = new ArrayList<>(Arrays.asList("name1", "name2", "name3", "name4","name5","name6"));
List<String> b = new HashSet<>(Arrays.asList("name1", "name2", "name4", "name6"));
for (String s : a) {
if (!b.contains(s)) {
insertToDb(s);
}
}
或在Java 8中使用Stream API:
List result = a.stream().filter(s -> !b.contains(s)).collect(Collectors.toList());
// alternatively: Set result = a.stream().filter(s -> !b.contains(s)).collect(Collectors.toSet());