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

时间: 2024-11-05 17:33:06

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

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

应用Java泛型和反射导出CSV文件

项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. public <T> void saveFile(List<T> list, String outFile) throws IOException { if (list == null || list.isEmpty()) { return; } if (StringUtils.isEmpty(outFile)) { throw new Illega

Java基础笔记(三:文件与数据流)

一.输入流与输出流 输入流将数据从文件.标准输入或其他外部输入设备中加载到内存.输出流的作用则刚好相反,即将在内存中的数据保存到文件中,或传输给输出设备.输入流在Java语言中对应于抽象类java.io.InputStream及其子类,输出流对应于抽象类java.io.OutputStream及其子类.抽象类java.io.InputStream与java.io.OutputStream定义了输入流和输出流的基本操作. (1)InputStream和FileInputStream 因为java.

Java之利用openCsv将csv文件导入mysql数据库

前两天干活儿的时候有个需求,前台导入csv文件,后台要做接收处理,mysql数据库中,项目用的springboot+Vue+mybatisPlus实现,下面详细记录一下实现流程. 1.Controller层部分: /** * 读取csv文件,批量插入到数据库中 */ @RequestMapping("/importcsv") @RequiresPermissions("xxx:xxxxx:xxx") public R importCsv(@RequestParam(

统计大文件里单词

转载统计大文件里,频数最高的10个单词,(C# TPL DataFlow版) 最近公司搞了一个写程序的比赛,要求从2G的文件里统计出出现频率最高的10个单词. 最开始的想法是使用字典树,后来发现字典树更适合用在找前缀上,在查找没有hash表效率高. 之后使用Hash表+DataFlow完成了功能,2G的文件处理在20秒以内(其实我有信心优化到10秒以内,但是太折腾了). 这是我的设计图: 为什么要形成那么多结果?因为我不想写锁,写锁会降低很多效率,而且也失去了线程的意义,每个线程做自己的工作,

java基础增强:统计网上app下载情况,并排序

一入编程深似海,从此妹子是路人. 案例: 统计网站app下载的情况,后台数据如下: 日期,用户名,app名,下载渠道,所在城市,app版本 2017-08-15,xx老师,陌陌,app store,上海,v2.9 2017-08-15,xx老师,脉脉,jdk1.8,上海,v2.3 2017-08-15,oo老师,陌陌,app store,上海,v2.6 .......多条上述格式的数据 效果要求: 要求统计完后的表示格式: 统计出每天的app版本升级情况 日期 用户名 app名 新版本下载渠道

【Java基础】——HashMap设计原理&amp;实现分析

HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入探讨HashMap的内部结构和实现细节,讨论HashMap的性能问题,并且在文中贯穿着一些关于HashMap常见问题的讨论. 读完本文,你会了解到:   1. HashMap的设计思路和内部结构组成 2. HashMap中的一些概念: 什么是阀值?为什么会有阀值?什么是加载因子?它们有什么作用? 3

Java基础——Servlet(八)文件上传下载

一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 <% if(request.getParameter("flag")!=null){ SmartUpload su=new SmartUpload(); su.initialize(pageContext); su.upload(); su.save("/upload_file

Java基础:HashMap和HashSet

转载请注明出处:jiq?钦's technical Blog 一.HashMap HashMap,基于散列(哈希表)存储"Key-Value"对象引用的数据结构. 存入的键必须具备两个关键函数: (1)equals():  判断两个Key是否相同,用来保证存入的Key的唯一性: (2)hashCode(): 根据k-v对象的Key来计算其引用在散列表中存放的位置: HashMap底层结构是一个数组: transientEntry<K,V>[] table 而其中Entry&