题解 | #合并表记录#

合并表记录

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);
}

全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务