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

流、图、减……是怎么做到的?

齐承泽
2023-03-14

我有一个字符串a的列表,并试图找到a的所有元素a按照某种规则与a的另一个元素b匹配,然后创建一个映射 > ,其中包含所有的a->所有匹配的b。

详细内容:

  • 对于a中的每个a,使用谓词P将其与a中的每个b进行比较。
  • 如果P(a,b)匹配,则从a和b生成一对(x,y)。
  • 将所有对按x分组,并以映射形式返回。
Pairs(x,y) = forEach(a,b in A) 
  where (a != b && P(a, b)) 
  generatePairXY(a, b)
Map(x -> List(y)) = group(Pairs(x,y)) by x

这种方法的问题是,我首先需要构造一个庞大的对列表,如果我的数据集只有几百万字,那么它可能会耗尽内存。

共有1个答案

西门骁
2023-03-14
List<String> list = ...;
Map<String, List<String>> map = 
  list.stream()
      .collect(Collectors.toMap(a -> a, a -> list.stream()
                                                 .filter(b -> P(a,b))
                                                 .collect(Collectors.toList()))
               );

其思想是为原始列表的每个字符串创建一个映射,其中包含一个键,以及一个值,该值是匹配该键的所有字符串的过滤列表。

编辑:

下面是一个完整的工作示例,在该示例中,如果两个字符串不相等但长度相同,则谓词P返回true:

package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test
{

  public static boolean P (String a, String b)
  {
    return a.length() == b.length() && !a.equals(b);
  }

  public static void main (String[] args)
  {
    List<String> list = new ArrayList<String>();
    list.add ("aaa");
    list.add ("bbb");
    list.add ("ccc");
    list.add ("cccc");
    list.add ("dddd");
    list.add ("ddd");

    Map<String, List<String>> map = 
      list.stream()
          .collect(Collectors.toMap(a -> a, a -> list.stream()
                                                     .filter(b -> P(a,b))
                                                     .collect(Collectors.toList()))
               );
    for (String key : map.keySet ()) {
      System.out.print (key + ": " );
      for (String value : map.get(key)) {
        System.out.print (value+ " ");
      }
      System.out.println("");
    }
  }

}
aaa: bbb ccc ddd
ccc: aaa bbb ddd
bbb: aaa ccc ddd
ddd: aaa bbb ccc
dddd: cccc
cccc: dddd
 类似资料:
  • 从隐藏元素不再占用空间的意义上来说,在iOS中制作流畅布局的正确方法是什么? 我有一个表格视图,每个单元格中有一个定制的详细类型的视图,带有标题、副标题和一行额外信息: 额外信息最多可以是三对图标和一个带有值的标签。单元内所有视图的布局都是使用AutoLayout完成的,没有丢失或不明确的约束。 我想实现的是,当值为0时,图标和标签不会显示,右侧的视图会向左移动。 如果我只使用< code>set

  • 我目前正在读O'reilly的《Java 8 Lambdas》是一本非常好的书。我遇到了这样一个例子。 我有一个 这会产生正确的输出。 我的问题是将reduce方法视为最后一个参数,即二进制运算符 我的问题是这个参数用于哪个?如果我改变 如果我传递NULL,则输出相同,然后返回N.P.E。 for此参数用于什么? 更新 为什么如果我在上运行它,我会收到不同的结果? 第一次运行。 第二次运行 第三次

  • 本文向大家介绍你是怎么做数据分析的?相关面试题,主要包含被问及你是怎么做数据分析的?时的应答技巧和注意事项,需要的朋友参考一下 考察的是数据分析的能力。主要从以下4个维度回答,结合具体的数据分析来进行阐述: 明确数据分析的目的; 确定数据分析的方法以及获取所需要的数据; 对数据进行预处理,并进行分析; 输出数据分析报告,提出相应建议。

  • 本文向大家介绍你是怎么做用户调研的?相关面试题,主要包含被问及你是怎么做用户调研的?时的应答技巧和注意事项,需要的朋友参考一下 考察用户调研和访谈的能力,可以从以下几个维度分析: 明确调研目的,选择调研方式:用户访谈(电话、线下、圆桌访谈、微信)、问卷调研; 确定调研的对象,怎么找到你需要调研的对象,即调研的目的是什么,根据目的是寻找调研对象; 准备好调研问题和提纲; 调研结果收集和分析,形成调研