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