题解 |HJ102 #字符统计#
字符统计
https://www.nowcoder.com/practice/c1f9561de1e240099bdb904765da9ad0
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); char[] chars = str.toCharArray(); Map<Character, Integer> map = new HashMap<>(); // 样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a. 输出cda //先将str按照ASCII大到小排序好再存进map // char a = '0'; // for (int i = 0; i < chars.length; i++) { // for (int j = i+1; j <chars.length ; j++) { // if (chars[i]<chars[j]){ // //若右小于左则交换 // a = chars[j]; // chars[j] = chars[i]; // chars[i] = a; // } // } // //此时map中是adc // } // System.out.println("排序以后 "+Arrays.toString(chars) ); for (int i = 0; i < chars.length; i++) { map.put(chars[i], map.getOrDefault(chars[i], 0) + 1); //此时map中是cda } // System.out.println(map); // Set<Map.Entry<Character, Integer>> entrySet = map.entrySet(); //使用比较器按照value值进行倒序输出 ArrayList<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { @Override public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { //使用比较器按照value值进行倒序输出 o2.comp o1 就是倒序 int result = o2.getValue().compareTo(o1.getValue()); //result==0就是value值相等 其他情况为不相等 //value值相等时按照key值正序排序 return result == 0 ? o1.getKey() - o2.getKey() : o2.getValue() - o1.getValue(); } }); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i).getKey()); } // System.out.println(); // 输出map看出map本身并未改变 改变的只是list中的顺序 // System.out.println(map); // for (Map.Entry<Character, Integer> entry : entrySet) { // System.out.print(entry.getKey());; //// System.out.print(entry.getValue()); // } } }
本人解法中本题难点在于按照map的value值倒序输出且value值相等时按照Key值正序输出;
#华为机试#