2 回答
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
Map適合根據(jù)出現(xiàn)次數(shù)獲取字符的情況。Map只是將數(shù)據(jù)存儲(chǔ)在鍵值對(duì)中的結(jié)構(gòu)。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)此處。
因此,要獲取字符及其在沒(méi)有 java8 的情況下出現(xiàn)的次數(shù),您可以這樣做:
public Map<Character, Long> countChar(String string) {
Map<Character, Long> result = new LinkedHashMap<>();
char[] chars = string.toCharArray();
for (char c : chars) {
if (result.get(c) != null) {
result.put(c, result.get(c) + 1);
} else {
result.put(c, 1L);
}
}
return result;
}
接下來(lái),您要按出現(xiàn)次數(shù)對(duì)值進(jìn)行排序。在這種情況下,您可以按值對(duì)結(jié)果映射進(jìn)行排序。請(qǐng)參閱Sort a Map<Key, Value> by values以找到您更熟悉的解決方案。要在沒(méi)有流的情況下執(zhí)行此操作,但使用 java8:
List<Map.Entry<Character, Long>> list = new ArrayList<>(result.entrySet());
list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
現(xiàn)在您可以像這樣打印每個(gè)字符:
StringBuilder output = new StringBuilder();
for (Map.Entry<Character, Long> entry : list) {
output.append(entry.getKey());
}
System.out.println(output);
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
一種可能的解決方案可能是以下方法:
private static String rearrange(String text) {
return Arrays.stream(text.split("")) // create a stream with all letters
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) // create a map counting the occurrences of each letter
.entrySet().stream() // create a stream of the map
.sorted(Map.Entry.<String, Long>comparingByValue().reversed() // sort the letters by frequency, reversed for most frequent first
.thenComparingInt(e -> text.indexOf(e.getKey()))) // sort by position in original text if letter frequency is equal
.map(Map.Entry::getKey) // map back to stream with all letters
.collect(Collectors.joining()); // join all letters
}
它返回重新排列的字符串:
String text = "HelloWorld";
String rearranged = rearrange(text);
System.out.println(rearranged);
哪個(gè)打?。?/p>
loHeWrd
添加回答
舉報(bào)
