题解 | #合并表记录#
合并表记录
https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201
// Scanner in = new Scanner(System.in);
//BufferedReader 只能逐行读取原始文本数据,需要手动解析和转换数据类型。
// StreamTokenizer类提供了许多方便的方法来处理输入流中的标记,使得将输入数据转换为需要的数据类型更为简单。它可以自动识别和处理数字、字符串、注释等不同类型的标记,并提供了方法来获取标记的类型和值。
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//保存顺序!!
Map<Integer, Integer> map = new TreeMap<>();
int rows = scanner.nextInt();
for (int i = 0; i < rows; i++) {
int index = scanner.nextInt();
int value = scanner.nextInt();
if (map.containsKey(index)) {
map.put(index, map.get(index) + value);
}else {
map.put(index, value);
}
}
for (Integer index : map.keySet()) {
System.out.println(index + " " + map.get(index));
}
}
}
// hasNext() 方法用于检查输入流中是否还有下一个 token(词法单元),也就是下一个由分隔符(默认包括空格、制表符和换行符)分隔的数据片段。
// import java.util.*;
// import java.io.*;
// public class Main {
// public static void main(String[] args) throws Exception{
// StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// st.nextToken(); // 分隔符
// int n = (int) st.nval; // 强转
// int[] arr = new int[n];//数组越界!!!!!!!!!!!!!!!!!
// for (int i = 0; i < n; i++) {
// st.nextToken();
// int key = (int) st.nval;
// st.nextToken();
// int value = (int) st.nval;
// arr[key] = arr[key] + value;
// }
// StringBuilder sb = new StringBuilder();
// for (int i = 0; i < arr.length ; i++) {
// if(arr[i] != 0){
// sb.append(i).append(" ").append(arr[i]).append("\n");
// }
// }
// System.out.println(sb.toString());
// }
// }
TreeMap保存顺序。
用Gif判断是否contains,不能用三目运算符了。
1. **排序:**
- `TreeMap`会根据键的自然顺序对键值对进行排序,或者根据提供的`Comparator`进行排序。
- `HashMap`不保证键值对的顺序,即插入顺序不会被保存,也不会按照键的顺序进行排序。
2. **性能:**
- `HashMap`的查找、插入和删除操作的时间复杂度为O(1),在大多数情况下性能更好。
- `TreeMap`的查找、插入和删除操作的时间复杂度为O(log n),因为它是基于红黑树实现的。
3. **同步:**
- `HashMap`是非线程安全的,如果需要使用在多线程环境下,需要使用`Collections.synchronizedMap`方法进行包装。
- `TreeMap`也是非线程安全的,如果需要在多线程环境下使用,也需要进行适当的同步操作。
一般来说,如果需要按照键的顺序进行操作或者需要有序地遍历Map,可以选择`TreeMap`。如果对顺序没有特殊要求,而更加关注性能,可以选择`HashMap`。
在Java语言中,三元运算符(conditional operator)的表达式要求有一个确定的返回值,但HashMap.put()方法的返回值是之前与key关联的值,如果之前未关联任何值,则返回null。因此,对于表达式hashmap.containsKey(key) ? hashmap.put(key, value+hashmap.get(key)) : hashmap.put(key, value);无法编译是因为这个表达式的两个分支并没有类型匹配。
if(hashmap.containsKey(key)) {
hashmap.put(key, value + hashmap.get(key));
} else {
hashmap.put(key, value);
}
查看12道真题和解析
