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())
表示:通过按顺序连接批次,将这个字符串流变成单个字符串。
我正在尝试找到一种方法,将 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())
表示:通过按顺序连接批次,将这个字符串流变成单个字符串。