笔试题.对Hashmap进行排序

题目
输入投票详情,计算选手票数,若同票,则输出按名字进行排序,字母小的在前,若字母一直相同,则输出名字短的。

示例
输入:
Tom,Tommy,Lucy,Tom,Tommy,Lucy
输出:
Lucy
解释:Tom,Tommy,Lucy均同票,但L小于T,所以输出Lucy

分析
用hashmap统计票数,重写比较器,按票数降序排序,同票则比较名字。

具体代码

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] s = sc.nextLine().split(",");
        for(int i = 0;i < s.length;i++){
            if(s[i].charAt(0)<'A'||s[i].charAt(0)>'Z'){
                System.out.println("error.0001");
                return;
            }
            for(int j = 1;j < s[i].length();j++){
                if(s[i].charAt(j)<'a'||s[i].charAt(j)>'z'){
                    System.out.println("error.0001");
                    return;
                }
            }
        }
        HashMap<String,Integer> map = new HashMap<>();
        for(int i = 0;i < s.length;i++){
            if(map.containsKey(s[i])){
                map.put(s[i],map.get(s[i])+1);
            }else{
                map.put(s[i],1);
            }
        }
        List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                if(o2.getValue()<o1.getValue()){
                    return o2.getValue()-o1.getValue();
                }
                else if(o2.getValue() == o1.getValue()){
                    int i = 0;
                    while(i<o2.getKey().length()&&i<o1.getKey().length()&&o2.getKey().charAt(i)==o1.getKey().charAt(i)){
                        i++;
                    }
                    if(i < o2.getKey().length()&&i < o1.getKey().length()){
                        return o1.getKey().charAt(i)-o2.getKey().charAt(i);
                    }else {
                        return o1.getKey().length()-o2.getKey().length();
                    }
                }
                else{
                    return o2.getValue()-o1.getValue();
                }
            }
        });
        System.out.println(list.get(0).getKey());
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值