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输入和输出控制台摘要
版权声明:本文博主原创文章,博客,未经同意不得转载。
java基金会 之 HashMap统计csvWord文档的更多相关文章
- Java 用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- Java jacob调用打印机打印word文档
前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...
- Java SE之XML<一>XML文档规约
[文档整理系列] Java SE之XML<一>XML文档规约 1.xml文档引用: 1.外部私有DTD: <!DOCTYPE rootNodeName SYSTEM "ur ...
- JAVA - JDK 1.8 API 帮助文档-中文版
JAVA - JDK 1.8 API 帮助文档-中文版 百度云链接: https://pan.baidu.com/s/1_7FFadw1a6J0qTfx2FzqPQ 密码: 41n4
- 中国象棋V2:Java源代码、毕业设计等所有文档,已经全部提交到CSDN-Code平台
下载地址:https://code.csdn.net/FansUnion/chinesechess-v2 主要内容:Java源代码.毕业设计.API文档.声音图片等资源.Demo截图等一切的一切. 2 ...
- 【Java】Java注释 - 单行、块、文档注释
简单记录,Java 核心技术卷I 基础知识(原书第10 版) 注释 我们在编写程序时,经常需要添加一些注释,用来描述某段代码的作用,提高Java源程序代码的可读性,使得Java程序条理清晰. 写代码的 ...
- 统计 Word 文档字数的方式
描述 欲统计某文档的字数,有两种方式. "审阅"选项卡--"校对"组--字符统计 点击左下角字数统计 审阅查看字数 此步骤较为复杂,在审阅选项卡中可以查询文档的 ...
- Java多种方式动态生成doc文档
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5280272.html 本来是要在Android端生成doc的(这需求...),最后方法没有好的方法能够在An ...
- 用java语言通过POI实现word文档的按标题提取
最近有一个项目需要将一个word文档中的数据提取到数据库中.就去网上查了好多资料,最靠谱的就是用poi实现word文档的提取. 喝水不忘挖井人,我查了好多资料就这个最靠谱,我的这篇博客主要是借鉴htt ...
随机推荐
- 低压电力采集平台DW710C与PC沟通
集电极485接口RS-485与RS-232转换模块485端相连.RS-485与RS-232转换模块232通过串行电缆末端PC的232串口.我们通过书面沟通PC通信软件来实现双方并执行收购方案. 1)上 ...
- 【C语言探索之旅】 第三课:你的第一个程序
内容简介 1.课程大纲 2.第一部分第三课:你的第一个程序 3.第一部分第四课预告:变量的世界 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个 ...
- 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)
1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...
- WORD中怎样自己主动生成文件夹?
步骤: 1.输入当做标题的文字 2.将文字设置为标题样式 3.光标放在要加入�文件夹的位置 4.选择插入->引用->索引和文件夹->文件夹->确定
- linux shell 不同进制数据转换(二进制,八进制,十六进制,base64) (转)
shell可以在不调用第3方命令,表示不同进制数据.这里总结以下表示方法.shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值.如:以 0 ...
- Oracle性能分析3:TKPROF简介
tkprof它是Oracle它配备了一个命令直插式工具,其主要作用是将原始跟踪文件格文本文件的类型,例如,最简单的方法,使用下面的: tkprof ly_ora_128636.trc ly_ora_1 ...
- java--照片和BYTE这些东西阵列
使用java,图像被变换成BYTE排列.和该阵列为图象,远程传输的图片进行 参考:http://blog.csdn.net/huang9012/article/details/18241539 代码例 ...
- 为大型数据文件每行只能产生id
为大型数据文件每行只能产生id 4个主要思路: 1 单线程处理 2 普通多线程 3 hive 4 Hadoop 搜到一些參考资料 <Hadoop实战>的笔记-2.Hadoop输入与输出 h ...
- java中 try return finally return(转)
finally块里面的代码一般都是会执行的,除非执行 System.exit(int),停止虚拟机,断电. 1.若try代码块里面有return ,假设要return 的值 是A,A为基本类型或者被f ...
- Gradle 2.0用户手册——总览(译)(转)
2.1 特性 本章将介绍一系列Gradle的特性. 申明式构建和基于约定的构建 Gradle的核心是基于Groovy呈现了一种丰富的针对特定领域的语言,称之为Domain Specific Langu ...