Java:计算 Arraylist 中的字符出现次数

Java: Counting Char Occurance in a Arraylist

我正在尝试找到一种方法,将 char 及其值从数组列表中添加到一起。

我的列表是=[A, Q3, Q, Z2, B2, C2, B4]

可以使用正则表达式模式和正则表达式匹配器以这种方式return 数组列表。我试图让它看起来像这样:

A = 1, B = 6, C = 2, Q = 4, Z = 2,

亲切的问候

var in = List.of("A", "Q3", "Q", "Z2", "B2", "C2", "B4");

Map<String, Integer> values =
 in.stream().collect(Collectors.toMap(
   s -> s.substring(0, 1),
   s -> s.length() == 1 ? 1 : Integer.parseInt(s.substring(1)),
   (a, b) -> a + b,
   () -> new TreeMap<>()));

System.out.println(values);

> {A=1, B=6, C=2, Q=4, Z=2}

一段一段:

in.stream() - 我们要使用流API修改列表

的内容

.collect - 我们要获取数据;无需转换或过滤任何这些项目,我们希望所有这些都收集到新的数据类型中

toMap - 具体来说,一个 Map,它将一些键(例如 B)映射到某个值(例如 6)。

然后我们传递 4 个参数。

  • 参数 1,'keyMapper':s -> s.substring(0, 1)

这表示:要获得密钥(映射 B 中的 'B' 映射到 6),获取任何输入字符串,并将其缩减为仅第一个字符。

  • 参数 2,'valueMapper':s -> s.length == 1 ? 1 : Integer.parseInt(s.substring(1))

这表示:要获取值,首先检查字符串的长度是否为 1,如果是,则值为 1。否则,去掉第一个字符,然后将其余字符解析为数字

  • Arg3,'merge' 函数:(a, b) -> a + b.

要合并任何 2 个值(例如 "Q3" 中的 3 个值和 "Q" 中的 1 个值),请将它们相加。

  • Arg4:地图供应商:() -> new TreeMap<>()

我们都希望将其放入一个新的 TreeMap 类型的地图中; TreeMaps 使自己自动按键排序。这意味着 'A=1' 对在地图中排在第一位,然后是 B,然后是 C,依此类推。 <> 告诉 java 自动找出这个映射应该有哪些键和值(字符串到整数,由于 keyMapper 和 valueMapper 函数而自动派生)。

如果您对此不熟悉,arg -> code; 的意思是:这是一个接受指定参数然后 运行 代码的函数。它会关闭该功能(无需 运行ning 它;这取决于您将此功能交给的代码,运行 它)。 () 是 'no arguments'.

如果您想获取生成的地图并生成准确的字符串...

String r = map.entrySet().stream()
  .map(x -> x.getKey() + " = " + x.getValue() + ", ")
  .collect(Collectors.joining());
System.out.println(r);
> A = 1, B = 6, C = 2, Q = 4, Z = 2,

虽然我不确定你为什么要那样做。

.map() 将 foos 流变成条形,这里我们说:取一个地图条目(一个对象,其中 .getKey() 给你 "B".getValue() 给你例如 6),然后通过 运行 将代码 "B" + " = " + 6 + ", " 转换为字符串,从而使 "B = 6, ".

.collect(Collectors.joining()) 表示:通过按顺序连接批次,将这个字符串流变成单个字符串。