加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java中HashMap排序中实现Comparator接口

发布时间:2020-12-14 06:38:59 所属栏目:Java 来源:网络整理
导读:1、通过观察Collections.sort()源码,如下: void sort(List list,Comparator c) { Object[] a = list.toArray(); Arrays.sort(a,(Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j 发现:(1)第一个参数必须是list类型,所以如果是H

1、通过观察Collections.sort()源码,如下:

 void sort(List list,Comparator c) {
        Object[] a = list.toArray();
        Arrays.sort(a,(Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j

发现:(1)第一个参数必须是list类型,所以如果是HashMap是没有办法实现排序的,这也很容易理解,因为HashMap是按照key去存储数据的,每个key的value都有自己特定的bucket,而list是数组存储或者链表存储的,所以可以按照元素的value值进行排序。那么为了实现对HashMap中对value进行排序,那么就要做一个转换:

1.1、将HashMap转为一个list的表达式

1.2、再对新生成的list表达式调用Collections.sort()方法就可以啦。

2、这个问题是在牛客网刷题遇到的,所以把题目也顺道记录下来吧。

2.1、

<div class="subject-describe" style="font-size:14px;line-height:1.8;color:rgb(90,103,111);font-family:arial,'宋体';">

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。? 处理: 1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并) 2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并) 3.输入的文件可能带路径,记录文件名称不能带路径

文件路径为windows格式

如:E:V1R2productfpgadrive.c 1325

结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。

如果超过8条记录,则只输出前8条记录.

如果文件名的长度超过16个字符,则只输出后16个字符

2.2、code如下:已经ac

import java.util.*;

/**

  • Created by caoxiaohong on 17/10/14.

  • 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号...

  • 注意:

  • 1.记录最多有8条错误记录.

  • 2.对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(故:文件所在的目录不同,文件名和行号相同也要合并)

  • 3.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,不要合并)

  • 4.输入的文件可能带路径,记录文件名称不能带路径.

  • 输入规定:

  • 一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
    */
    public class ErrorRecordsList {
    public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    //String[] input=new String[8];
    HashMap<String,ArrayList> records=new HashMap<String,ArrayList>();//list中元素顺序:name,linNum,times,index
    int index=0;//出现次序
    for(;;){
    String tmp=scanner.nextLine();
    if(tmp==null || tmp.equals(""))
    break;
    String[] namePath=tmp.split(" ")[0].split("");
    String lineNum=tmp.split(" ")[1];
    String name=namePath[namePath.length-1];
    if(records.containsKey(name+lineNum)){ //相同错误记录
    int times=Integer.valueOf(records.get(name+lineNum).get(2))+1;
    records.get(name+lineNum).set(2,String.valueOf(times));
    }else{
    ArrayList list=new ArrayList();
    if(name.length()<=16)
    list.add(name);
    else {
    int len=name.length();
    list.add(name.substring(len-16,len));
    }
    list.add(lineNum);
    list.add("1");
    list.add(index+++"");
    records.put(name+lineNum,list);
    }
    }
    /**排序:错误个数times降序,出现顺序index升序

    • 注意:Collections.sort()方法是对list进行排序的,所以需要把map转为list,再进行排序
      **/
      ArrayList<Map.Entry<String,ArrayList>> entry=new ArrayList<Map.Entry<String,ArrayList>>(records.entrySet());
     Collections.sort(entry,new Comparator<Map.Entry<String,ArrayList<String>>>() {
         @Override
         public int compare(Map.Entry<String,ArrayList<String>> list1,Map.Entry<String,ArrayList<String>> list2){
             int times1=Integer.valueOf(list1.getValue().get(2));
             int times2=Integer.valueOf(list2.getValue().get(2));
             int index1=Integer.valueOf(list1.getValue().get(3));
             int index2=Integer.valueOf(list2.getValue().get(3));
             if(times1==times2)
                 return index1-index2;
             else
                 return times2-times1;
         }
     });
    
     //输出
     Iterator<Map.Entry<String,ArrayList<String>>> iterator=entry.iterator();
     int count=8;
     while (iterator.hasNext() &amp;&amp; count-->0){
         ArrayList<String> arr=iterator.next().getValue();
         System.out.println(arr.get(0)+" "+arr.get(1)+" "+arr.get(2));
     }

    }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读