繁体   English   中英

如何使用 Java 8 遍历 Map 以获取重复字符键的字符串

[英]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 中做到这一点。你能分享一些如何实现这一点的提示吗?

这是你需要的吗?

        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);

您可以使用 forEach() 和 StringBuilder 来组合。

StringBuilder sb = new StringBuilder(); 
  map.forEach((k,v) -> { 
  for (int i = 0; i < v; i++) { 
    sb.append(k); 
  } 
}); 

您可以使用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

当您使用没有String.repeat(…)方法的 Java 8 时,您可以使用

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流来解决这个问题的想法。

总体思路:

  • 创建地图条目流;
  • 根据每个条目生成单字母字符串流,并使用内置收集器joining()合并它们;
  • 通过collectorjoin joining()应用collect 来获得最终结果。
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());

使用此链接玩在线演示

如上所述,您可以使用 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)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM