如何遍历 Map 以获取一串具有 Java 的重复字符键 8
How to iterate over a Map to obtain a String of repeated Character Keys with Java 8
我有一个 Map
如下所示:
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c', 5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
我需要获得输出:
cccccffrDDD
我可以在正常过程中完成,但我想在Java 8. 你能分享一些如何实现的提示吗?
您可以使用String.repeat(int count)
(在Java 11中介绍)流式传输映射的条目集并以其值作为因子打印键,可能如下:
public static void main(String[] args) {
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c',5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
// stream the set of entries and repeat the (String version of the) key value-times
map.entrySet().forEach(e -> System.out.print(e.getKey().toString().repeat(e.getValue())));
}
这会打印
cccccffrDDD
可以使用forEach()和StringBuilder组合
StringBuilder sb = new StringBuilder();
map.forEach((k,v) -> {
for (int i = 0; i < v; i++) {
sb.append(k);
}
});
这是你需要的吗?
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c',5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
StringBuilder sb = new StringBuilder();
map.forEach((k,v)->{
sb.append(String.valueOf(k).repeat(v));
});
System.out.print(sb);
请注意,repeat 方法仅在 Java 11 以上可用。
对于Java 1.8版本
StringBuilder sb = new StringBuilder();
map.forEach((k,v)->{
for(int i=0; i<v; i++) {
sb.append(k);
}
});
System.out.print(sb);
当您使用 Java 8 时,它没有 String.repeat(…)
方法,您可以使用
String result = map.entrySet().stream()
.map(e -> {
char[] array = new char[e.getValue()];
Arrays.fill(array, e.getKey());
return CharBuffer.wrap(array);
})
.collect(Collectors.joining());
或使用自定义收集器:
String result = map.entrySet().stream()
.collect(Collector.of(
StringBuilder::new,
(sb, e) -> { for(int i = e.getValue(); i > 0; i--) sb.append(e.getKey()); },
StringBuilder::append,
StringBuilder::toString));
这里有一些关于如何使用 Java 8 流解决此问题的想法。
总体思路:
- 创建地图条目流;
- 根据每个条目生成 single-letter 字符串流,并使用 built-in 收集器合并它们
joining()
;
- 使用收集器
joining()
进行收集以获得最终结果。
String joinedLetters = map.entrySet().stream()
.map(entry -> Stream.generate(() -> String.valueOf(entry.getKey()))
.limit(entry.getValue())
.collect(Collectors.joining()))
.collect(Collectors.joining());
另一种实现方式:
- 创建条目流;
- 使用
Collections.nCopies()
; 创建轻量级字符串列表
- 使用静态方法
String.join()
; 将每个列表变成 String
- 使用收集器
joining()
将字符串组合在一起。
String joinedLetters = map.entrySet().stream()
.map(entry -> Collections.nCopies(entry.getValue(), String.valueOf(entry.getKey())))
.map(list -> String.join("", list))
.collect(Collectors.joining());
用这个link玩Online demo
如上所述,您可以使用 lambda 表达式构建字符串,如下所示。
StringBuilder output = new StringBuilder();
map.forEach((k, v) -> {
for (int i = 0; i < v; i++) {
output.append(k);
}
});
或者您可以将标准替换为 IntStreams。
StringBuilder output = new StringBuilder();
map.forEach((k, v) -> IntStream.range(0, v).forEach(i -> b.append(k)));
我有一个 Map
如下所示:
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c', 5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
我需要获得输出:
cccccffrDDD
我可以在正常过程中完成,但我想在Java 8. 你能分享一些如何实现的提示吗?
您可以使用String.repeat(int count)
(在Java 11中介绍)流式传输映射的条目集并以其值作为因子打印键,可能如下:
public static void main(String[] args) {
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c',5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
// stream the set of entries and repeat the (String version of the) key value-times
map.entrySet().forEach(e -> System.out.print(e.getKey().toString().repeat(e.getValue())));
}
这会打印
cccccffrDDD
可以使用forEach()和StringBuilder组合
StringBuilder sb = new StringBuilder();
map.forEach((k,v) -> {
for (int i = 0; i < v; i++) {
sb.append(k);
}
});
这是你需要的吗?
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
map.put('c',5);
map.put('f', 2);
map.put('r', 1);
map.put('D', 3);
StringBuilder sb = new StringBuilder();
map.forEach((k,v)->{
sb.append(String.valueOf(k).repeat(v));
});
System.out.print(sb);
请注意,repeat 方法仅在 Java 11 以上可用。
对于Java 1.8版本
StringBuilder sb = new StringBuilder();
map.forEach((k,v)->{
for(int i=0; i<v; i++) {
sb.append(k);
}
});
System.out.print(sb);
当您使用 Java 8 时,它没有 String.repeat(…)
方法,您可以使用
String result = map.entrySet().stream()
.map(e -> {
char[] array = new char[e.getValue()];
Arrays.fill(array, e.getKey());
return CharBuffer.wrap(array);
})
.collect(Collectors.joining());
或使用自定义收集器:
String result = map.entrySet().stream()
.collect(Collector.of(
StringBuilder::new,
(sb, e) -> { for(int i = e.getValue(); i > 0; i--) sb.append(e.getKey()); },
StringBuilder::append,
StringBuilder::toString));
这里有一些关于如何使用 Java 8 流解决此问题的想法。
总体思路:
- 创建地图条目流;
- 根据每个条目生成 single-letter 字符串流,并使用 built-in 收集器合并它们
joining()
; - 使用收集器
joining()
进行收集以获得最终结果。
String joinedLetters = map.entrySet().stream()
.map(entry -> Stream.generate(() -> String.valueOf(entry.getKey()))
.limit(entry.getValue())
.collect(Collectors.joining()))
.collect(Collectors.joining());
另一种实现方式:
- 创建条目流;
- 使用
Collections.nCopies()
; 创建轻量级字符串列表
- 使用静态方法
String.join()
; 将每个列表变成 - 使用收集器
joining()
将字符串组合在一起。
String
String joinedLetters = map.entrySet().stream()
.map(entry -> Collections.nCopies(entry.getValue(), String.valueOf(entry.getKey())))
.map(list -> String.join("", list))
.collect(Collectors.joining());
用这个link玩Online demo
如上所述,您可以使用 lambda 表达式构建字符串,如下所示。
StringBuilder output = new StringBuilder();
map.forEach((k, v) -> {
for (int i = 0; i < v; i++) {
output.append(k);
}
});
或者您可以将标准替换为 IntStreams。
StringBuilder output = new StringBuilder();
map.forEach((k, v) -> IntStream.range(0, v).forEach(i -> b.append(k)));