我有一個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 中做到這一點。你能分享一些如何實作這一點的提示嗎?
uj5u.com熱心網友回復:
這是你需要的嗎?
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);
uj5u.com熱心網友回復:
您可以使用 forEach() 和 StringBuilder 來組合。
StringBuilder sb = new StringBuilder();
map.forEach((k,v) -> {
for (int i = 0; i < v; i ) {
sb.append(k);
}
});
uj5u.com熱心網友回復:
您可以使用(在 Java 11 中引入)流式傳輸映射的條目集并使用其值作為因子列印鍵String.repeat(int count)
,可能如下所示:
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
uj5u.com熱心網友回復:
當您使用沒有該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));
uj5u.com熱心網友回復:
這里有一些關于如何使用Java 8流來解決這個問題的想法。
總體思路:
- 創建地圖條目流;
- 根據每個條目生成單字母字串流,并使用內置收集器合并它們
joining()
; - 對collector應用collect,
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
使用靜態方法String.join()
; - 使用收集器將字串組合在一起
joining()
。
String joinedLetters = map.entrySet().stream()
.map(entry -> Collections.nCopies(entry.getValue(), String.valueOf(entry.getKey())))
.map(list -> String.join("", list))
.collect(Collectors.joining());
使用此鏈接玩 在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477712.html
上一篇:pythonregexfindall回傳兩組而不是一組
下一篇:在R中生成隨機字母和空格的字串