第一篇Blog,记录下今天失败的面试
京华信息–java开发,机试没通过,直接回家了…
大四学生,自己平时也动手练的挺多的,可能是涉及过于简单了吧
就当是算积累一些题目经验了吧,
机试题如下:
List<String> list = Arrays.asList(new String[]{"1,张三,50","2,李四,80","3,王五,40","4, 张三,90","5,王五,70"});
输出所有同学的名字及其平均分
按平均分升序
运行如下:
王五:55
张三:70
李四:80
回来一直被折磨,后来上社区,参考了以下两篇文章:
https://blog.csdn.net/weixin_44098851/article/details/103378449
https://blog.csdn.net/Azadoo/article/details/106971897
感觉自己真的是太菜了,看题觉得自己行了,可是怎么写都不对,2333…真的难受
话不多说,直接上代码:
public static void main(String[] args) {
List<String> list = Arrays.asList(new String[]{"1,张三,50","2,李四,80","3,王五,40","4,张三,90","5,王五,70"});
/*
* 输出所有同学的名字及其平均分
* 按平均分升序
* */
//map1用来存放 姓名,总分数
HashMap<String, Integer> map1 = new HashMap<>();
//map2用来存放 姓名,科目数
HashMap<String, Integer> map2 = new HashMap<>();
//key
String k=null;
//value
Integer v = null;
for (String s : list) {
//原文章在这里用subString()方法,不推荐,假如集合里有3个字及以上的姓名,这个方法就行不通了
//每个人都是按{序号,姓名,分数}的格式,用split()拆分成String数组直接按下标取比较合理
String[] strings=s.split(",");
k = strings[1];
v = Integer.parseInt(strings[2]);
//基本逻辑判断,不存在正常put,存在则计算后put
if (map1.get(k) == null) {
map1.put(k, v);
map2.put(k, 1);
} else {
map1.put(k, map1.get(k) + v);
map2.put(k, map2.get(k) + 1);
}
}
//计算每个人的平均分,并重新put到集合中进行覆盖,最终得到我们想要操作的数据
for (Map.Entry<String, Integer> entry : map1.entrySet()) {
String name = entry.getKey();
Integer score = entry.getValue()/map2.get(name);
map1.put(name, score);
}
/*
排序:这里用到Collections和Comparator的知识,我之前没了解和使用过comparable和Comparator,
加上对Collections工具类不是很熟练,所以没想到用这种方式去排序
*/
//1.拿到map1的键值对集合
Set<Map.Entry<String, Integer>> entrySet = map1.entrySet();
//2.将set集合转为List集合,为了使用Collections工具类的排序方法
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
//3.按要求根据集合的value排序,降序的话反过来写就行
return o1.getValue() - o2.getValue();
}
});
//4.创建一个新的有序的HashMap集合
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
//5.将entryList中的数据存储在linkedHashMap中
for (Map.Entry<String, Integer> entry : entryList) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
linkedHashMap.forEach((K,V)-> System.out.println(K+":"+V));
}
好好总结,希望自己能找到工作!