java基金会 之 HashMap统计csvWord文档

一:知识的补充( 这个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)(是否已经包括此keyword)。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);
		
	}
}

三: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输入和输出控制台摘要



版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-24 21:49  mengfanrong  阅读(325)  评论(0编辑  收藏  举报