(一)题目描述
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
(二)输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
(三)输出描述:
输出合并后的键值对(多行)
示例1
输入
4 0 1 0 2 1 2 3 4
输出
0 3 1 2 3 4
(四)解答
import java.util.*;
//此处Main类若不加public修饰,则编译器报无法找到Main类的错误
public class Main{
public static void main(String[] args){
fun1();
}
//注意转换思路:不要直接拿上一次获得的KEY与下一次获得的key作比较,然后进行value值得相加操作
//应该是将前面的键值对添加到一个容器里面,然后判断容器中是否包含将要获取到的键值对
public static void fun1(){
Scanner sc = new Scanner(System.in);
//为了满足多组测试用例
while(sc.hasNext()){
//输出键值对呈现升序排列,使用TreeMap进行存储
TreeMap<Integer,Integer> map = new TreeMap<>();
//接收第一个数,即后续键值对对数
int count = sc.nextInt();
for(int i = 0;i < count;i++){
//存储接下来的第一对键值对
int key = sc.nextInt();
int value = sc.nextInt();
//map集合有get方法,根据key值获取value值;containsKey,containsValue方法判断map中是否存在该值
if(map.containsKey(key)){
//如果集合中包含相同的key值,说明要实行合并操作,get方法根据key值获取对应的value,并将其加上现在的value值
//妙啊
map.put(key,map.get(key)+value);
}else{
map.put(key,value);
}
//以上操作可以执行count次
}
//完成了以上添加合并操作后,需要将其打印出来,常见的方法有迭代器方法,增强for循环方法等
for(Integer m:map.keySet()){
//通过key找到value,遍历map键的set视图
System.out.println(m+" "+map.get(m));
//注意输出形式,key和value之间存在空格,而不是其他
}
}
}
}
(五)引申
(a)此题处理是否有相同key值的思路转换非常重要,就是将键值对存入容器中,对于后面输入的键值对,只需要判断容器中是否contains该键值即可。
(b)此题涉及到map集合的遍历,之前不是很熟,在此总结一下map集合遍历的几种方式
(1)遍历方式一:获得key的Set集合,使用forEach循环获得key值,然后由map的get方法,由key值获取value值
package cn.shu.map;
import java.util.HashMap;
import java.util.Set;
public class MapAll {
public static void main(String[] args) {
HashMap<String,Integer> hm = new HashMap<>();
hm.put("zhangsan", 24);
hm.put("lisi", 34);
hm.put("JayChow", 54);
hm.put("Stephen", 43);
Set<String> keySet = hm.keySet();
for(String str:keySet){
int num = hm.get(str);
System.out.println(str+" "+num);
}
}
}
//控制台输出:
lisi 34
JayChow 54
zhangsan 24
Stephen 43
(2)遍历方式二:获得map集合的键值对关系视图entrySet,然后通过迭代器获取key-value关系,然后通过键值对关系的getKey()方法和getValue()方法获得key和value值。
public class MapAll {
public static void main(String[] args) {
HashMap<String,Integer> hm = new HashMap<>();
hm.put("zhangsan", 24);
hm.put("lisi", 34);
hm.put("JayChow", 54);
hm.put("Stephen", 43);
Set<Entry<String, Integer>> entrySet = hm.entrySet();
Iterator<Entry<String, Integer>> it = entrySet.iterator();
while(it.hasNext()){
Entry<String, Integer> entry = it.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+" "+value);
}
}
}
(3)遍历方式三:使用for循环,不使用迭代器,来遍历key-value的映射视图(entrySet()),然后
通过映射的getKey()和getvalue()获得key和value值
public class MapAll {
public static void main(String[] args) {
HashMap<String,Integer> hm = new HashMap<>();
hm.put("zhangsan", 24);
hm.put("lisi", 34);
hm.put("JayChow", 54);
hm.put("Stephen", 43);
for(Map.Entry<String, Integer> entry:hm.entrySet()){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+" "+value);
}
}
}