一:知识补充( 这个HashMap Map 和 c++的Map还是有很大的区别的,区别之大让人瞠目结舌,当然两者的作用是一致的,但是函数名称出入很大,就连iterator区别也很大的 )
(1)HashMap 和 HashTable的区别(c++中只有map木有hashmap的)
HashMap不是线程安全的
hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
HashTable是线程安全的一个Collection。
(2)HashMap的注意事项
HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中;
向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。
HashMap应用举例:控制台输入一句英语,简单统计各个单词出现的次数
(3)iterator与c++的不同:第一步:得到key值的集合 Set<String> set = map.keySet(); 第二步:用iterator遍历set集合 Iterator<String> iterator = set.iterator; iterator.hashNext(); iterator.next(); 第三步:put / get (key) 求得value值 map.containsKey(key)(是否已经包含此关键字),map.put(key,value)存入键值对,map.get(key)返回key值所对应的value值。
(4)在此,再一次的透露自己的一个拙计的行为:Scanner类自己是第一次用,为什么说拙计呢?是因为自己认为算是比较早认识学习java的学习java的AWT 、Swing,之后就是javaWe的jsp servelet等等,从第一个java applet的简单的计算公式的编译器开始到五子棋;再到第一个只有jsp + tomcat的javaWeb项目到 目前用到spring restful的javaWeb项目。连一个Scanner类或者java控制台输入输出都没有研究过,当然源代码更是没有深入过。
(5)总之,再一次的在这里讽刺自己,激励自己,同时也给后来人一个忠告!低调做人高调做事:一定要研究源代码级别的,一定要把基础打牢打扎实。
二:控制台输入 统计单词
package edu.tju.cs; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set; public class HashMap3Dimensions { public void mprint(String sentence){ String regex = " "; String[] words = sentence.split(regex); Map<String,Integer> map = new HashMap<String,Integer>(); int i; for(i=0;i<words.length;i++){ if(map.containsKey(words[i])){ // 说明map中,存在该元素 int num = map.get(words[i]); map.put(words[i], ++num); }else{ // 第一次key map.put(words[i], 1); } } System.out.println("统计单词出现的个数,结果如下:"); Set<String> set = map.keySet(); for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ String key = iterator.next(); Integer value = map.get(key); System.out.println(key + ":" +value); } } // main 入口 public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入一句话,以进行单词统计():"); String sentence = sc.nextLine(); HashMap3Dimensions hm = new HashMap3Dimensions(); hm.mprint(sentence); } }
三:统计csv文件的内容
package edu.tju.cs; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set; public class HashMap3Dimensions { private Map<String, Integer> originalMap = new HashMap<String, Integer>(); private Map<String, Integer> destinationMap = new HashMap<String, Integer>(); private Map<String, Integer> O_DMap = new HashMap<String, Integer>(); static int original = 1; // original的下标 static int destination = 5; // destination的下标 static String regre = ","; // split 函数的分隔匹配字符 public void mprint(String filePath, String toFilePath){ try { String encoding="GBK"; File file=new File(filePath); int cp = 1; if(file.isFile() && file.exists()){ //判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file),encoding);//考虑到编码格式 BufferedReader bufferedReader = new BufferedReader(read); //写入文件名处理 String fileName = toFilePath; BufferedWriter writer = new BufferedWriter(new FileWriter(new File(fileName))); // 原始一行数据和数据是否需要改变的符号 String originalLine = null; while((originalLine = bufferedReader.readLine()) != null){ // 字符串分隔 int i = 1; String tmp[] = originalLine.split(regre); // 统计各个站点的入度 和 出度 if(tmp.length>5){ // original node if(originalMap.containsKey(tmp[original])){ int num = originalMap.get(tmp[original]); originalMap.put(tmp[original], ++num); }else{ originalMap.put(tmp[original], 1); } // destination node if(destinationMap.containsKey(tmp[destination])){ int num = destinationMap.get(tmp[destination]); destinationMap.put(tmp[destination], ++num); }else{ destinationMap.put(tmp[destination], 1); } // o_d node String od = tmp[original] + "," + tmp[destination]; if(O_DMap.containsKey(od)){ int num = O_DMap.get(od); O_DMap.put(od, ++num); }else{ O_DMap.put(od, 1); } } } // 关闭写文件 writer.close(); read.close(); } else { System.out.println("找不到指定的文件"); } } catch (Exception e) { System.out.println("ReadToWrite……读取文件内容出错"); e.printStackTrace(); } // System.out.println("统计单词出现的个数,结果如下:"); // Set<String> set = map.keySet(); // for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ // String key = iterator.next(); // Integer value = map.get(key); // System.out.println(key + ":" +value); // // } } // main 入口 public static void main(String[] args){ // 源地址和目标地址 String filePath = "D:\\tjdata_metro\\TOKEN_ENEX_201404_20W.csv"; String toFilePath = "D:\\tjdata_metro\\新建文件夹\\"; HashMap3Dimensions hm = new HashMap3Dimensions(); hm.mprint(filePath,toFilePath); } }
四:java控制台的输入输出总结