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

一:知识补充( 这个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控制台的输入输出总结



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。