Java习题(二)

(一)题目描述

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照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);
     }
	}
}

猜你喜欢

转载自blog.csdn.net/jaybillions/article/details/81104866
今日推荐