gpt4 book ai didi

java - 比较两个长度不等的列表并删除部分匹配项?

转载 作者:行者123 更新时间:2023-12-02 03:02:40 26 4
gpt4 key购买 nike

假设我有两个列表,例如:

List1 = Fulton Tax Commissioner 's Office, Grady Hospital, Fulton Health Department

List2 = Atlanta Police Department, Fulton Tax Commissioner, Fulton Health Department,Grady Hospital

我希望我的最终列表如下所示:

Final List = Fulton Tax Commissioner 's Office,Grady Hospital,Fulton Health Department,Atlanta Police Department

我可以通过将这两个列表添加到一个集合中来删除这些列表中的重复项。但如何删除像富尔顿税务专员这样的部分匹配项?

最佳答案

我建议:将结果设置为列表 1 的副本。对于列表 2 的每个成员:

  • 如果结果包含相同的成员,则跳过它。
  • 如果结果包含以列表 2 成员开头的成员,也跳过列表 2 成员
  • 如果结果包含属于列表 2 成员前缀的成员,则将其替换为列表 2 成员
  • 否则将列表 2 成员添加到结果中。

如果使用 Java 8,第二个和第三个项目符号中的测试可以通过流方便地完成,例如 result.stream().anyMatch(s -> s.startsWith(list2Member));.

还有优化的空间,例如使用TreeSet(如果可以对项目进行排序)。

编辑:在 Java 中:

    List<String> result = new ArrayList<>(list1);
for (String list2Member : list2) {
if (result.stream().anyMatch(s -> s.startsWith(list2Member))) { // includes case where list2Member is in result
// skip
} else {
OptionalInt resultIndex = IntStream.range(0, result.size())
.filter(ix -> list2Member.startsWith(result.get(ix)))
.findAny();
if (resultIndex.isPresent()) {
result.set(resultIndex.getAsInt(), list2Member);
} else {
result.add(list2Member);
}
}
}

结果是:

[Fulton Tax Commissioner 's Office, Grady Hospital, Fulton Health Department, Atlanta Police Department]

我相信这正是您所要求的结果。

进一步编辑:在 Java 9 中您可以使用(未​​测试):

            resultIndex.ifPresentOrElse(ix -> result.set(ix, list2Member), () -> result.add(list2Member));

关于java - 比较两个长度不等的列表并删除部分匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42226831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com