Java数据分析指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-21 00:11:24

点击下载

作者:(美)约翰·哈伯德(John R. Hubbard)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java数据分析指南

Java数据分析指南试读:

前言

“有人说,技术只有教给别人,自己才能真正理解。而真相是,除非教给计算机,即作为算法实现,否则依然无法真正理解。”——高德纳(Donald Knuth)

正如高德纳的名言,理解某种技术的最佳方法是实现。本书通过展示Java编程语言的实现,帮助你理解一些最重要的数据科学算法。

本书介绍的算法和数据管理技术通常归入以下领域:数据科学、数据分析、预测分析、人工智能、商业智能、知识发现、机器学习、数据挖掘,以及大数据。其中很多新颖的方法都会令人震惊!例如,ID3分类算法、K-均值和K-中心点聚类算法、亚马逊的推荐系统以及谷歌的PageRank算法,这些技术几乎影响着每一个使用网络电子设备的人。

本书之所以选择Java编程语言,一方面是因为这种语言使用广泛,另一方面是因为它的易获得性。此外,Java是面向对象语言;它有优秀的支持系统,比如强大的集成开发环境;它的文档系统高效易用;它有大量开源的第三方库,这些库基本可以支持数据分析师所有会用到的实现。比如MongoDB系统就是使用Java编写的,这并非巧合,我们将在第11章“Java大数据分析”中学习MongoDB系统。本书内容

第1章,“数据科学导论”,介绍本书主题,概述了数据分析的历史发展及其在解决社会关键问题方面扮演的重要角色。

第2章,“数据预处理”,阐述存储数据的多种格式、数据集的管理,以及基本的预处理技术,比如排序、合并和散列。

第3章,“数据可视化”,包含图形、图表、时间序列、移动平均、正态和指数分布以及Java应用。

第4章,“统计”,概述基本的概率和统计原理,包括随机性、多元分布、二项分布、条件概率、独立性、列联表、贝叶斯定理、协方差和相关性、中心极限定理、置信区间以及假设检验。

第5章,“关系数据库”,介绍关系数据库的开发与访问,包括外键、SQL、查询、JDBC、批处理、数据库视图、子查询以及索引。你将学习如何使用Java和JDBC分析存储在关系数据库中的数据。

第6章,“回归分析”,讲述预测分析的一个重要部分,包括线性回归、多项式回归以及多元线性回归。你将学习在Java中如何使用Apache Commons Math Library实现这些技术。

第7章,“分类分析”,包括决策树、熵、ID3算法及其Java实现、ARFF文件、贝叶斯分类器及其Java实现、支持向量机(SVM)算法、logistic回归、K-最近邻以及模糊分类算法。你将学习在Java中如何使用Weka库实现这些算法。

第8章,“聚类分析”,包括分层聚类、K-均值聚类、K-中心点聚类以及仿射传播聚类。你将学习如何在Java中使用Weka库实现这些算法。

第9章,“推荐系统”,包括效用矩阵、相似性度量、余弦相似性、亚马逊的item-to-item推荐系统、大型稀疏矩阵以及具有历史意义的网飞大奖赛(Netflix Prize competition)。

第10章,“NoSQL数据库”,主要介绍MongoDB数据库系统,同时介绍地理空间数据库和基于MongoDB的Java开发。

第11章,“Java大数据分析”,包括谷歌的PageRank算法及其MapReduce框架。需要特别注意两个典型示例——WordCount和矩阵操作,它们都是MapReduce的完整Java实现。

附录,“Java工具”,指导你安装本书用到的所有软件:NetBeans、MySQL、Apache Commons Math Library、javax.json、Weka以及MongoDB。阅读准备

本书的重点是帮助读者理解数据分析的基本应用原理和算法,方式是指导读者通过Java编程不断深化对基本原理和算法的理解。因此,读者需要具备一定Java编程经验。如果读者还具有一些基础的统计学知识和数据库工作经验,那么学习起来会感觉更轻松。目标读者

如果你是一名学生或者从业者,希望深入理解数据分析,并希望在该领域提高Java的算法开发能力,本书正是为你而写!排版约定

本书通过不同的文本样式区分不同种类的信息。这里举例说明这些样式并解释其含义。

书中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入,都会按这样的字体显示:“我们可以通过使用include指令包含其他环境。”

代码块设置如下:Color = {RED, YELLOW, BLUE, GREEN, BROWN, ORANGE}Surface = {SMOOTH, ROUGH, FUZZY}Size = {SMALL, MEDIUM, LARGE}

命令行的输入和输出格式如下:mongo-java-driver-3.4.2.jar mongo-java-driver-3.4.2-javadoc.jar

新术语和重要词汇以黑体表示。例如,你会在屏幕上看到在菜单或对话框中出现这样的文字:“点击下一个按钮可以移到下一屏。”注释警告或重要的注释形式如下。提示提示和技巧形式如下。  第1章 数据科学导论

数据分析是对数据进行组织、清洗、转换和建模的过程,目的是获取有价值的信息和新知识。数据分析、商业分析、数据挖掘、人工智能、机器学习、知识发现和大数据,这些术语也可以用来描述相似的过程。这些领域之间的区别更多体现在应用领域,而非基础本质。有人认为,这些领域都是数据科学新学科的一部分。

在从组织化数据中获取有效信息的过程中,关键步骤是应用计算机科学算法进行管理。而本书的重点就是这些算法。

数据分析是一个历久弥新的领域。它起源于数值方法和统计分析的数学领域,可以追溯至18世纪。近年来,随着互联网愈加普遍和海量数据逐渐可得,许多数据科学方法受到越来越多的关注,随后我们将研究这些算法。

在第1章中,我们来讲述数据分析史上的一些著名案例。这些案例可以帮助我们理解这门科学的重要性和未来前景。1.1 数据分析起源

数据与文明一样历史悠久,甚至年代更为古老。1.7万年前,法国拉斯科的原始居民为了纪念他们最伟大的狩猎胜利,尝试以洞穴壁画的形式记录这些胜利。这些记录为我们提供了旧石器时代人类活动的数据。从现代意义上讲,这些数据并没有被分析,也没有为我们提供新知识。但是,这些数据的存在本身就证明了人类需要使用数据保存自己的思想。

5000年前,美索不达米亚的苏美尔人在泥板上记录了更为重要的数据。那些楔形文字记录了与日常商业交易相关的大量会计数据。为了运用数据,苏美尔人不仅发明了文字,还发明了人类文明史上的第一个数字系统。

在1086年,威廉国王(译者注:1066年,诺曼底公爵威廉征服英格兰)为了确定王室和臣民的土地与财产范围,下令收集大量数据。因为这是对人们(物质)生活的最终盘点,因此被称为“末日审判书”。威廉国王分析这些数据,并确定了随后几个世纪中土地的所有权和纳税义务。1.2 科学方法

在1572年11月11日,一位名叫第谷·布拉赫的丹麦贵族青年观测到一颗超新星,我们现在称这颗超新星为SN1572。第谷从那时起一直到30年后逝世,将毕生的财富与精力都奉献给积累天文数据的事业。他有一位年轻的德国助手,名叫约翰尼斯·开普勒,开普勒(见图1-1)最终在1618年阐明了行星运动三大定律,而此前他花了18年的时间分析这些数据。

图1-1 开普勒

开普勒的成就通常被科学家视为科学革命的开始。从那时起,观察自然、收集数据、分析数据、形成理论,然后用更多的数据来检验这个理论,这成为了科学方法的基本步骤。请注意,这里的核心步骤是数据分析。

当然,今天的数据分析师熟悉的现代工具,包括算法和实现算法的计算机,当年的开普勒一样都没有。但是,他运用了对数,这项技术突破帮助他解决了数值计算的问题。开普勒曾在1620年说到,纳皮尔在1614年发明的对数对于他发现行星运动三大定律发挥着至关重要的作用。

开普勒的成就深深地影响了后辈伊萨克·牛顿。这两位大师都凭借科学方法获得了无与伦比的成功!1.3 精算科学

牛顿的朋友为数不多,埃德蒙·哈雷是其中一位。哈雷首次计算出彗星的轨道,后来这颗彗星以他的名字命名。哈雷博学多识,精通天文学、数学、物理学、气象学、地球物理学,以及制图学。

哈雷在1693年分析了死亡率数据,这些数据由德国布雷斯劳的卡斯帕·诺依曼编制。正如90年前布拉赫的数据启发了开普勒的工作一样,哈雷的分析也启发了新知识。根据他发表的结果,英国政府可以为年金制定合适的价格并进行出售,其依据是领取年金者的年龄。

尽管今天的大部分数据都是数值型的,但我们研究的大多数算法都可以运用于类型更加广泛的数据,包括文本、图像、音频以及视频文件,甚至互联网上的整个网页。1.4 蒸汽计算

1821年,一位名叫查理·巴贝奇(见图1-2)的剑桥大学青年学生钻研着一些刚刚手算出的三角函数表和对数表。当他发现数据中的错误举不胜举时,怒喊出“我真希望用蒸汽来计算”的设想。他建议这些表格可以使用蒸汽机驱动的机械自动计算。

图1-2 巴贝奇

巴贝奇是一位业余数学家,担任剑桥大学的卢卡斯数学教授,在此150年前,伊萨克·牛顿曾担任这个教席,在此150年后,斯蒂芬·霍金也担任这个教席。但是,巴贝奇一生的大部分时间中都致力于自动计算。他提出可编程计算机的概念后,被人们尊为第一位计算机科学家,而他的助手阿达·勒芙蕾丝被认为是第一位计算机程序员。

巴贝奇的目标是建立一台分析数据并可获取有价值信息的机器,这个功能是数据分析的核心步骤。如果这个步骤实现自动化,就可以在更大的数据集上更快地运行。巴贝奇对三角函数表和对数表相当有兴趣,这与他希望改进航海导航方法的目标紧密相关,而这个目标是大英帝国版图扩张的关键。1.5 一个惊人的例子

1854年,一场霍乱在伦敦的贫民区爆发。这场传染病之所以迅速传播,部分原因是没有人知道疾病的根源。但是,一位名叫约翰·斯诺的医生怀疑传染的根源是受污染的水。在那时,大部分伦敦人的生活用水来自公共水井,公共水井直接来自泰晤士河。图1-3展示了斯诺绘制的地图,黑色矩形标示霍乱发生的频率。

图1-3 斯诺医生的霍乱地图

如果你仔细看,还可以看到9个公共水泵的位置,用黑点标记并标注PUMP。根据这个数据,我们可以轻松看出宽街和剑桥街拐角处的水泵位于疾病的传染中心。这个数据分析启发斯诺去探索那个水泵的供水情况,结果他发现污水未经处理就通过管道的破口直接流入水泵。

斯诺通过在地图上定位公共水泵,提出疾病的源头很可能就是宽街和剑桥街拐角处的水泵。在公共卫生领域,这是一项最早的重大数据分析应用案例。霍乱在19世纪导致高达数百万人的死亡,詹姆斯·诺克斯·波尔克总统和作曲家彼得·伊里奇·柴可夫斯基也在其中。但这种疾病到今天依然普遍,全世界每年大约有10万人死于霍乱。1.6 赫尔曼·何乐礼

1789年,美国国会委托展开十年一度的人口普查,目的是确定众议员代表数量和征税的分配。第一次人口普查在1790年展开,当时美国的人口不足400万,普查仅仅计算自由人的数量。但美国人口的数量到1880年已经超过5000万。同时人口普查本身也变得更为复杂,它还需要记录家属、父母、出生地、财产和收入。

1880年的人口普查编制花了整整8年时间,因此美国人口普查局认识到需要使用某种自动化方式改进1890年的普查。他们雇佣一位名叫赫尔曼·何乐礼(见图1-4)的年轻工程师,他提议制造一台使用打孔卡片记录数据的电子制表机系统。

图1-4 何乐礼

这是自动化数据处理的首次应用,结果非常成功。普查制表才开始6周,报告的美国总人口就接近6200万。

因为这个成就,何乐礼获得了MIT的博士学位。他在1911年建立了计算—制表—记录公司,这家公司在1924年改名为IBM。IBM最近制造了超级计算机沃森,它可能是数据挖掘和人工智能领域最成功的大规模应用。1.7 ENIAC

在第二次世界大战期间,美国海军战列舰的火炮能将2700磅(约1225千克)的炮弹发射到24英里(约38.6千米)以外。炮弹在射程中飞行接近90秒。除了火炮的仰角、幅角以及发射初速度,炮弹的轨迹还会受到舰船运动、天气条件甚至是地球自转运动的影响。轨迹的精确计算非常重要。

为了解决计算问题,美国军队在宾夕法尼亚大学成立了一个工程师团队来建造ENIAC,也就是第一台可编程的完全电子化数字计算机。尽管直到第二次世界大战结束这个项目都没有完成,但它本身就是巨大的成功。

ENIAC(见图1-5)体积庞大,占了一个大房间,还需要一组工程师和程序员来操作。这台计算机的输入和输出数据都记录在何乐礼卡片上,其他的机器也可以自动读取这些卡片和打印内容。

图1-5 ENIAC

ENIAC在氢弹开发中发挥了重要作用,它取代了炮兵射表而用于氢弹模拟项目的第一次测试运行,使用的卡片多达100多万张。1.8 VisiCalc

1979年,哈佛学生丹·布里克林在上课时看到教授在黑板上修改财务数据表格条目的过程非常冗繁。教授一旦完成某个条目错误的修正,接着又要修正条目对应的边际条目。布里克林想到,这么单调的工作完全可以在他的新苹果II微型计算机上更轻松更准确地完成。后来他发明了VisiCalc软件包,这是第一个用于微型计算机的电子表格计算机程序。许多人都认为,这项发明将微型计算机从业余爱好者的游戏平台转向了正规的商业工具。

布里克林的VisiCalc引发了商业计算的范式转变。此前电子表格计算是商业数据处理的一种基本形式,计算过程需要庞大且昂贵的大型计算中心,而现在相同的工作只需要一个人使用一台个人计算机就可以完成。IBM PC发行两年以后,VisiCalc就成为商业和会计的基本软件。1.9 数据、信息和知识

1854年的霍乱传染案例是理解数据、信息和知识之间差异的一个典型的例子。斯诺医生使用的数据,包括霍乱爆发以及水泵位置的数据,都是已知的,但它们之间的关系是未知的。斯诺医生通过在一张城市地图上绘制两个数据集,确定宽街和剑桥街的水泵就是污染源。因此,关系就是新信息。新信息最终带来了新知识,一个新知识是疾病通过污水传播,另一个新知识是随后这种疾病的预防方式。1.10 为什么用Java

10多年来,Java一直都是世界主流的编程语言,同时越来越受欢迎,其理由相当充分:● Java在所有计算机上的运行方式相同;● 它支持面向对象编程(Object Oriented Programming, OOP)范

式;● 它容易与其他语言交互,包括数据库查询语言SQL;● 它的Javadoc文档易于访问和使用;● 大多数开源软件是使用Java编写的,包括那些用于数据分析的开

源软件。

其他的流行软件各有优势,Python的学习更轻松,R的运行更简单,JavaScript的网站开发更容易,C/C++的速度更快,但就通用编程来说,Java无可替代。

太阳计算机系统有限公司(Sun Microsystems)的詹姆斯·高斯林领导的团队在1995年开发了Java。甲骨文公司在2010年以7.4亿美元的价格收购了该公司,从此支持Java。本书撰写时的主流版本是2014年发布的Java 8。但当你购买本书时,Java 10应该可以找到,它在2018年3月发布。

正如本书书名所示,书中所有示例都使用Java编写。 附录包括使用Java设置计算机的方式说明。1.11 Java集成开发环境

为了简化Java软件开发,许多程序员会使用集成开发环境(Integrated Development Environment, IDE)。网上有多种优质的免费JavaIDE可以下载,包括:● NetBeans;● Eclipse;● JDeveloper;● JCreator;● IntelliJ IDEA。

这些IDE的工作原理类似,因此你只要使用过一个,就很容易使用别的。

尽管本书的所有Java示例都可以在命令行中运行,但我们还是选择在NetBeans上展示程序运行。这个IDE有许多优点,包括:● 代码清单包括行号;● 自动遵循标准的缩进规则;● 代码语法自动着色。

清单1-1是NetBeans中标准的“Hello World”程序。

清单1-1 Hello World 程序

当这个程序在NetBeans中运行时,可以看到它的一些语法着色:评论是灰色的,保留字是蓝色的,对象是绿色的,字符串是橘色的。

在大部分情况下,我们为了节省篇幅会省略展示清单中的头注释和包指定,仅仅展示程序,就像清单1-2这样:

清单1-2 缩短的Hello World程序

或者,有时我们仅展示main()方法,就像清单1-3这样:

清单1-3 进一步缩短的Hello World程序

无论如何,所有的完整源代码文件都可以从异步社区网站下载。

图1-6是“Hello World”程序的输出结果。

图1-6 Hello World程序的输出结果 附录阐述NetBeans的安装与启动。1.12 小结

本章的第1章讲述了一些引发数据分析发展的重大历史事件:古代商业记录的保管、英国皇家对土地和财富的资料汇编,以及天文学、物理和航海的精确数学模型。正是这些活动启发巴贝奇发明了计算机。从霍乱根源的识别,到经济数据的管理和海量数据的现代化处理,文明前进的步伐推动着数据分析的发展。

本书选择Java编程语言实现所研究的数据分析算法,本章简单解释了选择Java的理由,并在最后介绍了本书会一直使用的集成开发环境(IDE)——NetBeans。  第2章 数据预处理

在分析数据之前,通常需要对其形式进行标准化处理。本章描述这些处理的过程。2.1 数据类型

数据可以划分为不同的类型。数据类型不仅标识数据的形式,也标识可以对数据执行哪种操作。例如,算数运算可以对数值型数据执行,但不能对文本数据执行。

数据类型也决定了数据需要的计算机存储空间大小。例如,像3.14这样的十进制数值通常存储在一个32位(4字节)内存中,而像https://google.com这样的网址则占用160位内存。

下面是本书将要处理的数据主要类型,对应的Java类型显示在括号中:● 数值类型● 整数(int)● 小数(double)● 文本类型● 字符串(String)● 对象类型● 日期(java.util.Date)● 文件(java.io.File)● 一般对象(Object)2.2 变量

计算机科学将变量视为数据值的存储位置。Java通过对变量声明特定的类型来引入变量。例如,考虑下列语句:String lastName;

该语句声明变量lastName具有类型String。

另外,声明变量时还可以使用具体值进行初始化,就像这样:double temperature = 98.6;

该语句可以这样理解,命名为temperature的存储空间中包含double类型值98.6。

结构化变量还可以在一个语句中同时进行声明和初始化:int[] a= {88, 11, 44, 77, 22};

这个语句声明int数组类型的变量int[]包含5个指定元素。2.3 数据点和数据集

数据分析很容易将数据视为信息点。例如在一组个人信息中,每个数据点包含某个人的信息。考虑下列数据点:("Adams", "John","M", 26, 704601929)

它代表一位叫作John Adams的26岁男性,ID号为704601929。

数据点中的单个数据值称为字段(或属性)。每个数据值都有自己的类型。上例中5个字段的类型是3个文本的和两个数值的。

数据点的字段数据类型序列叫作类型签名,上例的类型签名是(文本、文本、文本、数值、数值)。该类型签名对应在Java中是(String, String, String, int, int)。

数据集是数据点的集合,一个数据集中所有数据点的类型签名都相同。例如代表一组人的一个数据集,其中每个点都代表组中的唯一成员。集合中所有点的类型签名都相同,因此签名就是数据集本身的特征。NULL值

有这样一种特殊的数据值,类型未定,还可以充当任何类型,这种数据值就是null值,它表示未知。例如,前面描述过的数据集包含的数据点("White", null, "F", 39, 440163867),代表一位39岁的人,姓氏是White、ID号码是440163867,女性,但她的名字缺少信息(或者未指定)。2.4 关系数据库表

在关系数据库中,每个数据集都可以看作一张表,每个数据点都是表中的一行。数据集签名定义表列。

表2-1是关系数据库表的例子,这个表有4行5列,表示包含5个字段4个数据点的数据集。

表2-1姓名性别年龄 ID AdamsJohn男26704601929Whitenull女39440163867JonesPaul男49602588410Adamsnull女30120096334

  这张表有两个null字段。

正如数据集中数据点的顺序无关紧要,数据库表在本质上是行集合,因此行顺序也一样无关紧要。同理,数据库表不会包含重复的行,数据集也不会包含重复的数据点。2.4.1 关键字段

数据集可以要求指定字段的所有值都不重复。这样的字段称为数据集的关键字段。在前面的示例中,ID数字字段可以当作关键字段。

在约束数据集(或数据库表)的关键字段时,设计者应该预见到数据集可能存储的数据类型。例如,前面表中的“First name”字段就是一种关键字段的糟糕的选择,因为许多人都会同名。

键值用于搜索。比方如果想知道保罗·琼斯的年龄,可以先找到ID为602588410的数据点(也就是行),再检查这个数据点的年龄。

数据集也可以不指定单个字段而指定字段的一个子集作为关键字段。例如在一个地理数据的数据集中,我们可以指定Longitude(经度)和Latitude(纬度)字段联合作为关键字段。2.4.2 键—值对

指定的字段子集(或单个字段)关键字段可以视为一组键—值对(Key-Value Pairs, KVP)。从这种角度看,每个数据点都包含两部分:它的键和对应的键值(实际中也用到属性值对这个术语)。

在前面的示例中,键是ID,值是Last name、First name、Sex、Age。

在之前提过的地理数据集中,键可以是Longitude、Latitude,而值可以是Altitude、Average Temperature、Average和Precipitation。

有时候,键—值对可以视为一种输入输出结构,关键字段是输入,字段的值是输出。例如,在地理数据集中,给定经度和纬度,数据集就返回对应的海拔、温度和平均降水量。2.5 哈希表

键值对的数据集通常会作为哈希表实现。健对于这种数据结构,就像索引对于集合,这很像书中的页码或表中的行数。这种直接访问比顺序访问快得多,后者就像在一本书中逐页搜索一个特定的词或者短语。

键值对数据集在Java中通常使用java.util.HashMap类实现。类型参数Key和Value是指定的类。(还有一个更古老的HashTable类,但过时了。)

图2-1是7个南美国家的数据文件。

图2-1 南美国家的数据文件

清单2-1是将这个数据载入HashMap对象的Java程序。

清单2-1 HashMap示例

Countries.dat文件在data文件夹中。第15行实例化一个名为dataFile的java.io.File对象来代表这个文件。第16行实例化一个名为dataset的java.util.HashMap对象。这个结构化文件具有String类型的键和Integer类型的值。在try代码块内部,我们实例化一个Scanner对象来读取文件。第22行每个数据点的载入都使用HashMap类的put()方法。

数据集载入后,我们在第27行打印它的大小,在第28行打印Peru的值(格式化代码“%,d”表示打印逗号分隔的整型数值。)

图2-2是HashMap程序的输出结果。

图2-2 HashMap程序的输出结果

注意在上一个示例中,get()方法是如何实现哈希表键值结构的输入输出内容。在第28行,输入是名称Peru,输出的结果是该国家的人口29907003。

哈希表改变某个特定键的值很容易。清单2-2是同一个HashMap示例,只是多3行代码。

清单2-2 改进后的HashMap示例

第29行将Peru的值改为31000000。

图2-3是程序修改后的输出结果。

图2-3 HashMap程序修改后的结果

注意,哈希表的大小不变!但键值更新后,put()方法加入了一个新的数据点。2.6 文件格式

上一个示例中的Countries.dat文件是一个平面文件,即没有特殊结构或格式的普通文本文件,是最简单的数据文件类型。

另一种常见的简单数据文件格式是逗号分隔值文件(Comma Separated Values ,CSV),也是一种文本文件,但数据值的分隔使用逗号而非空格。图2-4是CSV格式的数据,内容与上一个示例相同。

图2-4 CSV文件 这个示例增加了一个标题行,从而可以根据名称

Country和Population识别列。

为了Java可以进行正确的处理,必须告诉Scanner对象把逗号当作分隔符。清单2-3的第18行在input对象实例化后完成了这个任务。

清单2-3 读取CSV数据的程序

正则表达式|\\s表示逗号或任意空白。Java中的空格符号(空白、制表符、换行符等)由\s表示。当字符串使用反斜杠字符时,反斜杠字符本身需要前置另一个反斜杠来避免被转换,如\\s。管道符号|在正则表达式中表示“或”。图2-5是程序的输出。

图2-5 CSV程序的输出

格式化代码%-10s表示以10列字段格式打印字符串并左对齐。 格式化代码%,12d表示以12列字段格式打印字符串并右对齐,每3位数字之前加逗号(为了可读性)。2.6.1 微软Excel数据

从微软Excel读取和写入数据的最好方式是使用Apache软件基金会的POI开源API库。你可以从这里下载这个库https://poi.apache.org/download.html。选择当前的poi-bin压缩文件。

本节展示两个Java程序,用来在Map数据结构和Excel工作簿文件之间来回复制数据。我们使用TreeMap而没有使用HashMap的目的仅仅在于展示前者根据键值保持数据点顺序的方式。

第一个程序命名为FromMapToExcel.java,清单2-4是它的main()方法。

清单2-4 FromMapToExcel程序

第23行的load()方法将图2-1显示的Countries数据文件载入map。第24行的print()方法打印map的内容。第25行的storeXL()方法在我们的data文件夹中创建excel工作簿Countries.xls,先在这个工作簿中创建一个工作表,再把map数据存储在工作表中。

Excel工作簿和工作表的结果如图2-6所示。

注意这个数据与图2-1显示的数据相同。唯一的区别在于巴西的人口超过100000000,Excel以四舍五入的形式进行展示,并以指数符号表示:2.01E+08。

load()方法的代码与清单2-1的第15~26行相同(除了第16行)。

清单2-5是print()方法的代码:

图2-6 由FromMapToExcel程序创建的Excel表格

清单2-5 FromMapToExcel中的print()方法

清单2-5的第45行从map提取键(countries)的集合,接着第47行对每个国家提取对应的人口数量,第48行进行打印。

清单2-6是storeXL()方法的代码。

第60~63行实例化out、workbook、worksheet和countries对象,接着for循环的每次迭代都在worksheet对象中载入一行,这段代码含义清晰。

下一个程序从Excel表载入Java map结构,与之前程序的工作正好相反。

清单2-6 FromMapToExcel程序中的storeXL()方法

清单2-7 FromExcelToMap程序

它仅仅调用loadXL()方法并打印map结果。

清单2-8 FromExcelToMap程序中的loadXL()方法

第37~45行的循环对Excel工作表的每一行迭代一次。每次迭代得到这一行中两个单元格的值,并在第44行将数据对放入map中。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载