java基础 之 HashMap统计csv文件的单词

来源:互联网 发布:2016淘宝卖家怎么推广 编辑:程序博客网 时间:2024/06/04 17:50

一:知识补充( 这个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{// 第一次keymap.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);}}

三:java 控制台输入输出小结

Java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。
Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象. Scanner reader=new Scanner(System.in); 
然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型:  
next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()  
上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false. NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。

从JDK5.0开始,java.util包中增加了Scanner类,它是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。Scanner类从字面上讲是“扫描”的意思,它把给定的字符串解析成Java的各种基本数据类型,用于分解字符串的默认的分隔符是空格,也可以定制。其构造方法如表7-15。

表7-15 Scanner类的构造方法

方法

描述

Scanner(File source)

Scanner(File source, String charsetName)

构造一个新的 Scanner,其值是从指定文件扫描获得。后者指定了字符集。

Scanner(InputStream source)

Scanner(InputStream source, String charsetName)

构造一个新的 Scanner,其值是从指定的输入流扫描获得。后者指定了字符集。

Scanner(Readable source)

构造一个新的 Scanner,其值是从指定源扫描获得。

Scanner(ReadableByteChannel source)

Scanner(ReadableByteChannel source, String charsetName)

构造一个新的 Scanner,其值是从指定信道扫描获得。后者指定了字符集。

Scanner(String source)

构造一个新的 Scanner,其值是从指定字符串扫描获得。


由表7-15可见,Scanner可以从指定的文件、输入流、源、信道或字符串等多种来源构造获得。要从控制台读取数据,使用参数为InputStream的方法,传递标准输入流System.in给它,此时Scanner扫描该输入流中的字符,同时还可以让读入的字符串匹配一定的正则表达式模式,如果不匹配时将抛出InputMismatchException异常。

Scanner封装了很多方法,比如方法next就可以从各种输入流中连续读入字符串。不仅如此,它还可以读入除char之外的其他七种基本类型和两个大数字类型,并且不需要手工进行转换,如方法nextInt将读入的下一数据转换为int变量,方法nextByte将读入的下一数据转换为byte变量,方法nextLine将读入的下一行转换为String变量,等等。


四:统计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控制台的输入输出总结



0 1
原创粉丝点击