计算出现次数并打印出现次数最多的字符 'n' 次
Count occurrences & print highest occurred char 'n' times
我正在尝试解决一些程序,我遇到了这个有趣的程序,我们需要打印出现次数最多的字符 n 次,其他字符也是如此。
例如:输入字符串:“请保持水分”
输出字符串:“aaaeeettyysplhdr”
我只能解决一半,我们使用 HashMap 打印出现次数最多的字符及其出现的次数。
public static void repeatedChar(String str) {
char[] chars = str.toCharArray();
Map<Character, Integer> map = new HashMap<>();
for (Character c : chars) {
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
//Now To find the highest character repeated
int max = 0;
//setting to a by default
char maxCharacter = 'a';
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ": Value " + entry.getValue());
if (max < entry.getValue()) {
max = entry.getValue();
maxCharacter = entry.getKey();
}
}
System.out.println("Max Character = " + maxCharacter + " Max Count : " + max);
}
当前打印出现次数最多的字符以及该字符出现的次数。有人可以让我知道如何进一步进行吗?谢谢
为了获得所需的输出,您需要按值对地图进行排序。但是由于哈希图不是用来排序的,而是用来快速访问的,因此您可以将所有条目添加到列表中并对该列表进行排序。类似于:
import java.util.Map.Entry;
import java.util.Comparator;
....
public static void repeatedChar(String str) {
char[] chars = str.toCharArray();
Map<Character, Integer> map = new HashMap<>();
for (Character c : chars) {
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
//add map entries to list
List<Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
//sort entries by value descending
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
//print
for (Entry<Character, Integer> entry : list) {
for (int i = 0; i < entry.getValue(); i++){
System.out.print(entry.getKey());
}
}
}
如果您喜欢流方法:
import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
....
public static void repeatedCharWithStreams(String str) {
String output =
Pattern.compile("")
.splitAsStream(str)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.map(e -> e.getKey().repeat(e.getValue().intValue()))
.collect(Collectors.joining());
System.out.println(output);
}
我正在尝试解决一些程序,我遇到了这个有趣的程序,我们需要打印出现次数最多的字符 n 次,其他字符也是如此。
例如:输入字符串:“请保持水分” 输出字符串:“aaaeeettyysplhdr”
我只能解决一半,我们使用 HashMap 打印出现次数最多的字符及其出现的次数。
public static void repeatedChar(String str) {
char[] chars = str.toCharArray();
Map<Character, Integer> map = new HashMap<>();
for (Character c : chars) {
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
//Now To find the highest character repeated
int max = 0;
//setting to a by default
char maxCharacter = 'a';
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ": Value " + entry.getValue());
if (max < entry.getValue()) {
max = entry.getValue();
maxCharacter = entry.getKey();
}
}
System.out.println("Max Character = " + maxCharacter + " Max Count : " + max);
}
当前打印出现次数最多的字符以及该字符出现的次数。有人可以让我知道如何进一步进行吗?谢谢
为了获得所需的输出,您需要按值对地图进行排序。但是由于哈希图不是用来排序的,而是用来快速访问的,因此您可以将所有条目添加到列表中并对该列表进行排序。类似于:
import java.util.Map.Entry;
import java.util.Comparator;
....
public static void repeatedChar(String str) {
char[] chars = str.toCharArray();
Map<Character, Integer> map = new HashMap<>();
for (Character c : chars) {
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
//add map entries to list
List<Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
//sort entries by value descending
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
//print
for (Entry<Character, Integer> entry : list) {
for (int i = 0; i < entry.getValue(); i++){
System.out.print(entry.getKey());
}
}
}
如果您喜欢流方法:
import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
....
public static void repeatedCharWithStreams(String str) {
String output =
Pattern.compile("")
.splitAsStream(str)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.map(e -> e.getKey().repeat(e.getValue().intValue()))
.collect(Collectors.joining());
System.out.println(output);
}