题解 | #合并表记录#
合并表记录
https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201
hashmap默认是不排序的,
但是由于键入的key是int,int值的hash还是Int,
只要键入的值小于此时hashmap的初始化大小的数组的时候,就会将键入的值放入数组中,
放入的规则是根据hash值也就是键入的int值的大小。
所以从hashmap的底层原理出发,实现了排序。
https://juejin.cn/post/7182597553110646821
但是其实这个方法是错误的。因为这个解法的问题是:输入的key-value的key小于hashmap的容量时是正确的,比如输入的size是4,那下面的四组数据的key都不能超过4,否则就无法做到升序。因为hashmap的size必须是2的次方的大小,输入size=5,则hashmap的容量其实是2的3次方 = 8.这时候,key小于8的int值可以升序输出,超过(包括)8的话,就不是升序了。
4 0 1 0 2 1 2 20 4
import java.util.Scanner; import java.util.*; public class Main { public static void main(String agv[]) { Scanner scanner = new Scanner(System.in); int tableSize = scanner.nextInt();//读取table的大小 Map<Integer, Integer> table = new HashMap<>(tableSize);//新建一个hashtable for (int i = 0; i < tableSize; i++) {//对于每一行 int key = scanner.nextInt(); int value = scanner.nextInt(); if (table.containsKey(key)) {//如果存在key table.put(key, table.get(key) + value);//那么就相加 } else { table.put(key, value);//不然就直接放置key 和 value } } for (Integer key : table.keySet()) { System.out.println( key + " " + table.get(key)); } } }
正确的使用treemap的解法
import java.util.Scanner; import java.io.*; import java.util.*; public class Main{ public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); TreeMap<Integer, Integer> map = new TreeMap<>(); // 输出结果要求有序! while(sc.hasNextInt()){ int n = sc.nextInt(); for(int i = 0; i < n; ++i){ int a = sc.nextInt(); int b = sc.nextInt(); map.put(a,map.getOrDefault(a,0) + b); } } for (Integer i : map.keySet()) { System.out.println(i + " " + map.get(i)); } } }