如果統計的個數相同,則按照ASCII碼由小到大排序輸出 。如果有其他字符,則對這些字符不用進行統計。
實現以下接口:
輸入一個字符串,對字符中的各個英文字符,數字,空格進行統計(可反覆調用)
按照統計個數由多到少輸出統計結果,如果統計的個數相同,則按照ASII碼由小到大排序輸出
清空目前的統計結果,重新統計
調用者會保證:
輸入的字符串以‘\0’結尾。
輸入描述
aadddccddc
輸出
dca
算法實現
public class App {
public static void main(String[] args) {
String str = "aa ddd ccd dc";
// ascii, count
Map<Integer, Integer> map = new HashMap<>();
// ascii, ch
Map<Integer, Character> asMap = new HashMap<>();
int assicValue, countVal;
// 對字符串進行字符個數統計
for (char ch : str.toCharArray()) {
// 只處理英文字符,數字,空格進行統計
if (ch >= 'a' || ch <= 'z'
|| ch >= 'A' || ch <= 'Z'
|| ch >= '0' || ch <= '9'
|| ch == ' ') {
// 獲取當前字符對應的ascci碼
assicValue = Integer.valueOf(ch);
countVal = 0;
if (map.containsKey(assicValue)) {
countVal = map.get(assicValue);
}
map.put(assicValue, ++countVal);
asMap.put(assicValue, ch);
}
}
List<Pairs> list = new ArrayList<>();
map.forEach((k, v)-> {
list.add(new Pairs(k, v));
});
// 優先根據字符出現的個數進行降序排序
list.sort((p1, p2) -> {
// 如果個數相同, 則按照ascii碼進行升序排序
if (p1.getValue() - p2.getValue() == 0) {
// 升序
return p1.getKey() - p2.getKey();
}
// 降序
return p2.getValue() - p1.getValue();
});
// 輸出結果
StringBuilder rlt = new StringBuilder();
for (Pairs pairs : list) {
Integer k = pairs.getKey();
rlt.append(asMap.get(k));
}
System.out.println(rlt.toString());
}
@Data
@AllArgsConstructor
public static class Pairs {
private Integer key;
private Integer value;
}
}