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 ...
随机推荐
- Sqlserver2000联系Oracle11G数据库进行实时数据的同步
Sqlserver2000联系Oracle11G数据库进行实时数据的同步 1,前提条件 我有sqlserver2000环境,已经存在oracle11g环境,准备这两个数据库,建立各自的訪问账号,两者之 ...
- poj 2417 Discrete Logging(A^x=B(mod c),普通baby_step)
http://poj.org/problem?id=2417 A^x = B(mod C),已知A,B.C.求x. 这里C是素数,能够用普通的baby_step. 在寻找最小的x的过程中,将x设为i* ...
- crm2011i创建nt类型字段
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft ...
- Codeforces Round #274 (Div. 2) --A Expression
主题链接:Expression Expression time limit per test 1 second memory limit per test 256 megabytes input st ...
- MEF初体验之九:部件生命周期
理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...
- Ping azure
最近azure在虚拟机上打开(欧式世纪互联),这其实并不能ping虚拟机! 查了一下资料,发现azure不支持被ping这个功能(貌似是不开放ICMP-in这个协议).有些用户跟客服问过这个问题,可是 ...
- 有意练习--Rails RESTful(一)
书要反复提及<哪里有天才>在说,大多数所谓的天才是通过反复刻意练习获得. 当你的练习时间达到10000几个小时后,.你将成为该领域的专家. 近期在学习rails怎样实现RESTful We ...
- 实现BUG自动检测 - ASP.NET Core依赖注入
我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...
- hdu3836联通的强还原性点
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- Web Design 再生:UX Design
高质量的Web 模板,成熟的Design Pattern,人工智能的引用,移动技术的冲击是否标志着Web Design 结束的时代已经到来? Web Design 最终也未避免与“死亡”这个词的关联, ...