当前位置: 首页 > 知识库问答 >
问题:

比较两个列表并增加与java streams匹配的计数器

司寇阳曦
2023-03-14

我有两份清单<代码>列表1包含一些城市。

列表2包含子列表。每个子列表包含一个人已经访问过的国家(一个子列表=一个人访问过的国家)。在这个例子中,Person1去了罗马、阿姆斯特丹和维也纳,Person2去了阿姆斯特丹、巴塞罗那和米兰。。。

我想知道有多少人已经去过第一个名单上的国家。不应重复计算。因此,如果人员1已经从列表1前往两个国家,则只应计算一次。

我想用JavaStreams实现这个。有人知道我怎么做吗?

list1 = ["Barcelona", "Milan", "Athens"];
list2 = [["Rom", "Amsterdam", "Vienna"], ["Amsterdam", "Barcelona", "Milan"], ["Prais", "Athens"], ["Istanbul", "Barcelona", "Milan", "Athens"]];

//The expected result for this example is: 3
//Both lists already result from a stream (Collectors.toList())

谢谢!

共有2个答案

公孙宗清
2023-03-14

请看一下mapToInt()和sum()函数。

List<String> list1 = List.of("Barcelona", "Milan", "Athens");
        List<List<String>> list2 = List.of(List.of("Rom", "Amsterdam", "Vienna"),
                                           List.of("Amsterdam", "Barcelona", "Milan"),
                                           List.of("Prais", "Athens"),
                                           List.of("Istanbul", "Barcelona", "Milan", "Athens"));
int result = list2.stream().mapToInt(person -> person.stream().anyMatch(list1::contains) ? 1 : 0).sum();

我在这里要做的是创建一个所有人的流,然后根据列表1中是否包含他们访问过的国家,将每个人映射到1或0。

这与以下for循环示例相同:

int result = 0;
for (List<String> person : list2)
{
    int i = 0;
    for (String visited : person)
    {
        if (list1.contains(visited))
        {
            i = 1;
            break;
        }
    }
    result += i;
}
松昱
2023-03-14

您可以尝试以下操作:

    private static final List<String> CITIES = List.of("Barcelona", "Milan", "Athens");
    private static final List<List<String>> VISITED_CITIES = List.of(
            List.of("Rome", "Amsterdam", "Vienna"),
            List.of("Amsterdam", "Barcelona", "Milan"),
            List.of("Paris", "Athens"),
            List.of("Instabul", "Barcelon", "Milan", "Athens")
    );

    public static void main(String... args) {
        var count = VISITED_CITIES
                .stream()
                .flatMap(visited -> visited.stream().filter(CITIES::contains))
                .distinct()
                .count();
        System.out.println(count);
    }

通过此迭代,您将得到预期的结果3。但是,您可以修改代码,也可以将其收集到一个将显示频率的映射中(如果删除“distinct”中间步骤),如下所示:

        var count = VISITED_CITIES
                .stream()
                .flatMap(visited -> visited.stream().filter(CITIES::contains))
                .collect(Collectors.groupingBy(Function.identity()));
 类似资料:
  • 问题内容: 我想获取两个列表并查找两个列表中都出现的值。 [5]例如,将返回。 问题答案: 使用,它快速且可读。

  • 我有两个文件file1。txt和file2。txt。 文件1。文本 file2.txt 我想匹配文件1的第1、2和3列。带有文件2第1、4和5列的txt。txt。如果匹配,则将匹配行与以下行一起打印,直到,但不要打印。我用“awk”命令试过了

  • 问题内容: 我有两个列表(不是Java列表,可以说两列) 例如 我想要一个返回多少个相同元素的方法。对于此示例,它应该为3,并且应该返回列表的相似值和不同的值。 如果是,我应该使用哈希图,然后用什么方法获得结果? 请帮忙 PS:这不是学校作业:)因此,如果您只是指导我就足够了 问题答案: 编辑 这是两个版本。一种使用,另一种使用 比较它们并从中创建您自己的版本,直到获得所需的内容。 这应该足以覆盖

  • 我有两个表,分别是产品和采购: PRODUCTS表-将获得购买的所有新产品。这意味着表prroducts中不存在相同的productname。所有独特产品列表 采购表-具有唯一purchase_id的所有采购产品的列表。 > 如果要在PURCHASE中添加或插入值,表PRODUCTS将获得PURCHASE的所有值,但前提是PURCHASE中的productname不存在于PRODUCTS中的'pr

  • 问题内容: 比较mysql中逗号分隔的值,并在countcolumn中获取匹配的输出 例子: 通过比较ID 1和2,输出应为1 通过比较ID 2和3,输出应为1 通过比较ID 3和1,输出应为2 问题答案: 首先,您列出的数据实际上应该以一种格式存储,数据库的每一行都存储一个和一个,即3元素列表将对应3行。如果对您的结构进行了更改,则以下答案将是有意义的。 就目前而言,这是我整合的一个不错的MyS

  • 嗨,我有两个自定义数组列表,我想从一个数组列表中删除与第二个数组列表匹配的类似项。