题目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());
}
知识点:
- 文件读取
- 排序对象选择
2.1. ArrayList 有序集合 底层为数组 按下标查找快 增删慢 按元素查找、增删都慢
2.2. LinkedList 有序集合 底层为链表 按下标查找慢 增删快 按元素查找慢 增删比 ArrayList快
2.3. HashMap 无序哈希表 底层哈希表 按下标查找一般比LinkedList快 增删快跟主体大小有关 按元素查找快 增删快跟主体大小有关,越大越慢
3、如果有要求多线程需要改用 ConcurrentHashMap
作者:Jeebiz 创建时间:2020-06-03 22:56
更新时间:2024-10-26 16:27
更新时间:2024-10-26 16:27