思路:
万能哈希
1.第一行输入的是长度(整型数据)
2.后面N行输入的是”键值对“元素(字符串数据,要分割再处理),每一个元素有index和value,看看表中有无相同index,若有则将该value取出,相加后再更新表中value,若无则放入键值对进哈希表
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 import java.io.StreamTokenizer; 4 import java.util.*; 5 6 public class Main{ 7 public static void main(String[] args) throws Exception{ 8 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 9 int len = Integer.valueOf(br.readLine());//长度 10 //System.out.println("len: "+len); 11 int index=0,value=0; 12 String[] kvS = new String[2]; 13 int[] kv = new int[2];//每一对键值对 14 String str = ""; 15 Map<Integer,Integer> ages = new HashMap<Integer,Integer>(); 16 //int value = 0;//用于更新value值 17 for(int i =0;i<len;i++){ 18 str = br.readLine(); 19 //System.out.println("str: "+str); 20 kvS = str.split(" ");//每一行,空格分隔放入字符串数组 21 //System.out.println("kvS: "+kvS[0]+"kvS: "+kvS[1]); 22 //将字符串数组转为整型数组 23 kv[0] = Integer.valueOf(kvS[0]); 24 //System.out.println("key: "+kv[0]); 25 kv[1] = Integer.valueOf(kvS[1]); 26 //System.out.println("value: "+kv[1]); 27 28 if(ages.containsKey(kv[0])){ 29 //System.out.println("原value: "+ages.get(kv[0])); 30 ages.put(kv[0],ages.get(kv[0])+kv[1]); 31 //System.out.println("后value: "+ages.get(kv[0])); 32 }else{ 33 ages.put(kv[0],kv[1]); 34 //System.out.println("put in kv: "+ages.get(kv[0])); 35 } 36 }//while 37 38 //System.out.println("---------------------------------------"); 39 //输出 40 Set set = ages.keySet(); 41 Object[] ob = set.toArray(); 42 Arrays.sort(ob); 43 for(Object o : ob){ 44 System.out.println(o+" "+ages.get(o)); 45 } 46 47 48 49 } 50 }
百度:
StreamTokenizer使用
//创建StreamTokenizer对象 StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //获取数据 st.nextToken(); int i = (int) st.nval;//st.nval默认解析出的格式是double st.nextToken(); String a = st.sval;
错误:
应改为:
while (st.nextToken() != StreamTokenizer.TT_EOF)//无返回值 其他实例: while (st.nextToken() != StreamTokenizer.TT_EOF) { //在调用 nextToken 方法之后,ttype字段将包含刚读取的标记的类型 switch (st.ttype) { //TT_EOL指示已读到行末尾的常量。 case StreamTokenizer.TT_EOL: break; //TT_NUMBER指示已读到一个数字标记的常量 case StreamTokenizer.TT_NUMBER: //如果当前标记是一个数字,nval字段将包含该数字的值 s = String.valueOf((st.nval)); System.out.println(s); numberSum += s.length(); break; //TT_WORD指示已读到一个文字标记的常量 case StreamTokenizer.TT_WORD: //如果当前标记是一个文字标记,sval字段包含一个给出该文字标记的字符的字符串 s = st.sval; wordSum += s.length(); break; default: //如果以上3中类型都不是,则为英文的标点符号 s = String.valueOf((char) st.ttype); symbolSum += s.length(); } }
最后还是没有想到可以将换行符取消作为结束符的方法
换成bufferedReader了