题解 | #合并表记录#
合并表记录
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));
}
}
}
