题目2:一个文本, 每行都是ip, 需要统计出一共每个ip出现过多少次,并且根据出现次数从大到小排序

public static class MapValueComparator implements Comparator<Map.Entry<String, Integer>> {

    @Override
    public int compare(Entry<String, Integer> me1, Entry<String, Integer> me2) {
        // 按照从大到小的顺序排列,如果想正序 调换me1 me2的位置
        return me2.getValue().compareTo(me1.getValue());
    }
}

Map<String, Integer> dataMap = new HashMap<>();
File file = new File("text.txt");

// 读取方式1
try (BufferedReader reader = new BufferedReader(new FileReader(file));) {
    System.out.println("以行为单位读取文件内容,一次读一整行:");
    String line = null;
    // 一次读入一行,直到读入null为文件结束
    while ((line = reader.readLine()) != null) {
        System.out.println("line " + line);

    }
}
// 读取方式2
RandomAccessFile raf = new RandomAccessFile(file, "r");
String iptext ;
while((iptext =raf.readLine())!=null){
    dataMap.put(iptext, dataMap.getOrDefault(iptext, 0) + 1);
}
raf.close();

List<Map.Entry<String, Integer>> entryList = new LinkedList<Map.Entry<String, Integer>>( dataMap.entrySet() );
Collections.sort(entryList, new MapValueComparator());

Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
Iterator<Map.Entry<String, Integer>> iter = entryList.iterator();
Map.Entry<String, Integer> tmpEntry = null;
while (iter.hasNext()) {
    tmpEntry = iter.next();
    sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
知识点:
  1. 文件读取
  2. 排序对象选择
    2.1. ArrayList 有序集合 底层为数组 按下标查找快 增删慢 按元素查找、增删都慢
    2.2. LinkedList 有序集合 底层为链表 按下标查找慢 增删快 按元素查找慢 增删比 ArrayList快
    2.3. HashMap 无序哈希表 底层哈希表 按下标查找一般比LinkedList快 增删快跟主体大小有关 按元素查找快 增删快跟主体大小有关,越大越慢
    3、如果有要求多线程需要改用 ConcurrentHashMap
作者:Jeebiz  创建时间:2020-06-03 22:56
 更新时间:2023-12-22 21:08