8.合并表记录

该程序读取含有索引和值的数据,按索引合并并求和,使用TreeSet存储不重复的索引并保持排序,HashMap用于存储键值对。当遇到相同索引,会对已有值进行累加。最后遍历TreeSet并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。

提示:

0 <= index <= 11111111

1 <= value <= 100000

输入描述:

先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开

输出描述:

输出合并后的键值对(多行)

示例1

输入:

4
0 1
0 2
1 2
3 4

输出:

0 3
1 2
3 4

示例2

输入:

3
0 1
0 2
8 9

输出:

0 3
8 9

思路:

根据题目我们可以知道,首先,数据是以键值对的形式存储的,并且相同的键,数据要合并,其次,键要去重且排序

在之前的题目中我们做过去重且排序的场景,现在我们还可以这么做,用TreeSet将键存储起来,但是我不太清楚String的排序方式,所以这里把键转成了Integer存储到TreeSet中,

第二个问题,键值对的形式存储数据,那当然使用Map啊,

第三个问题,相同的键,数据要合并,那我们每次在向Map中存储数据之前,我们可以先判断一下Map中是否存在这个数据.

综合一下,最终的思路就是这样的:

  1. 我们先把第一行的数据释放掉,
  2. 开始存放数据,我们把每一行的数据取出来,并且根据空格去做一个分割,最后形成一个String数组,索引为0,代表键,索引为1代表值.
  3. 向Map中存储数据,存储之前先判断Map中是否存在当前的key,如果不存在,就直接存入,如果,存在,我们把Map已经存储的数据取出来,和我们当前的数据进行合并,合并之后再存入Map,
  4. 把键存储到TreeSet中
  5. 遍历TreeSet,取出TreeSet中存储的键.再通过键去Map中取对应的值.
  6. 通过字符串拼接,以正确的格式输出内容.
import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        // 释放第一行的数据
        String first = in.nextLine();
        TreeSet<Integer> tree = new TreeSet<>();
        HashMap<String, Integer> map = new HashMap<>();
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            String[] strs = str.split(" ");
            if (map.containsKey(strs[0])) {
                map.put(strs[0], Integer.parseInt(strs[1]) + map.get(strs[0]));
            } else {
                map.put(strs[0], Integer.parseInt(strs[1]));
            }
            tree.add(Integer.parseInt(strs[0]));
        }
        for (Integer i : tree) {
            System.out.println(i + " " + map.get(i + ""));
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值