简介 |
内容推荐 当今,数据科学正在广泛影响社会,无论是企业还是高校,许多领域正通过数据分析揭示隐藏的知识,包括机器学习、自然语言处理、信息检索、数据可视化等交叉学科正在助推这一领域的发展。上述领域的持续进步逐步向文科领域渗透,极大地带动了文科教学和研究的发展,例如,数字人文、社会计算、数字治理、智慧文旅、应急情报、数据新闻等成为新文科发展的新兴亮点。Java语言作为一门经典的编程语言,在面向对象程序设计和应用数据科学领域均有着卓越的表现。 本书旨在通过学习Java程序设计来引导读者将其与数据分析相结合,为培养新文科专业的交叉学科人才提供支持。全书共13章,介绍了变量,方法,条件控制,循环,字符串与数组,类与对象,面向对象的特性,继承、抽象类与接口,异常与输入输出,数据分析基础,Web爬虫,机器学习与文本挖掘应用等内容。 本书适合管理类专业高年级本科生或研究生作为面向对象程序设计、Java语言程序设计、数据科学导论、应用机器学习等相关课程的参考教材,也适合对Java语言编程以及数据分析领域感兴趣的读者参考。 目录 第1章 导论 1.1 数据科学与程序 1.2 编程语言 1.3 调试 1.4 形式语言和自然语言 1.5 第一个程序 1.5.1 注释 1.5.2 包名 1.5.3 main() 1.5.4 终端输出 1.6 程序开发工具包 1.6.1 JDK的下载与安装 1.6.2 集成开发环境的安装 本章习题 第2章 变量 2.1 输出 2.2 变量 2.3 赋值语句 2.4 打印变量 2.5 数据类型 2.6 关键字与标识符 2.7 运算符与表达式 2.8 拼接运算 本章习题 第3章 方法 3.1 强制类型转换 3.2 无返回值方法243.3类与方法 3.4 Java类库中方法的调用 3.5 形式参数和实际参数 3.6 返回值 3.7 参数传递 本章习题 第4章 条件控制 4.1 模运算 4.2 动态输入 4.3 条件类型 4.3.1 if语句 4.3.2 if…else 4.3.3 条件中的返回值 4.3.4 条件判断链 4.3.5 嵌套条件 4.3.6 switch语句 4.4 布尔运算与布尔表达式 4.5 逻辑运算符 本章习题 第5章 循环 5.1 多次赋值 5.2 while语句 5.3 do…while语句 5.4 for循环 5.5 封装与泛化 5.6 局部变量 5.7 break和continue 5.8 增强的for循环 本章习题 第6章 字符串与数组 6.1 字符串中获取字符 6.2 字符串长度 6.3 遍历字符串 6.4 字符串循环和计数 6.5 自增和自减运算 6.6 字符串的性质 6.7 数组 6.8 随机数 本章习题 第7章 类与对象 7.1 类的基本概念 7.2 定义类 7.3 对象的创建与使用 7.4 类的封装与面向对象程序设计原则 7.5 类中的参数传递 7.6 重载与方法签名应用 7.6.1 方法重载 7.6.2 返回值为数组类型的方法 7.6.3 方法中的可变参数 7.7 程序开发过程与逐步求精 7.8 包 7.9 Java程序设计的本质 本章习题 第8章 面向对象的特性 8.1 访问权限与私有成员 8.2 访问器和修改器 8.3 构造方法 8.4 静态变量、常量与类方法 本章习题 第9章 继承、抽象类与接口 9.1 继承 9.2 super关键字 9.3 类成员的可访问性 9.4 抽象类 9.5 多态 9.6 对象转换和instanceof操作符 9.7 接口 9.8 接口的等价性 9.9 面向对象的性质 本章习题 第10章 异常与输入输出 10.1 异常类型 10.2 异常处理方法 10.2.1 声明异常 10.2.2 抛出异常 10.2.3 捕获异常 10.3 创建自定义异常类 10.4 文件操作 10.5 文本文件I/O 10.5.1 使用Scanner读取数据 10.5.2 使用PrintWriter写数据 10.6 二进制文件I/O 本章习题 第11章 数据分析基础 11.1 数据分析的核心概念 11.1.1 数据类型 11.1.2 数据点和数据集 11.1.3 关系数据库表 11.1.4 哈希表 11.1.5 数据分析与机器学习 11.2 编写与解析XML文件 11.2.1 XML语法简介 11.2.2 解析XML文件 11.2.3 编写XML文件 11.3 编写与解析JSON文件 11.3.1 JSON语法 11.3.2 读取JSON文件 11.3.3 写入JSON文件 11.4 从PDF文件中提取文本 本章习题 第12章 Web爬虫 12.1 初识爬虫 12.1.1 HTTP请求技术 12.1.2 Jsoup与HTML解析技术 12.1.3 DOM、Xpath与正则表达式 12.1.4 Java爬虫框架 12.2 静态爬虫及其实现 12.3 动态爬虫及其实现 12.3.1 Selenium WebDriver简介 12.3.2 爬取新浪微博 12.4 爬虫客户端软件 12.4.1 火车采集器 12.4.2 八爪鱼采集器 本章习题 第13章 机器学习与文本挖掘应用 13.1 机器学习应用流程 13.1.1 数据与问题定义 13.1.2 数据收集 13.1.3 数据预处理 13.1.4 数据分析与建模 13.1.5 泛化与评估 13.2 面向机器学习的Java工具 13.2.1 环境库 13.2.2 大数据平台 13.2.3 机器学习库 13.3 利用MALLET进行文本挖掘 13.3.1 主题模型 13.3.2 MALLET安装 13.3.3 文本预处理 13.3.4 应用主题模型分析政策文本 13.4 进一步学习机器学习 本章习题 附录A 术语表 附录B 文科生如何入门编程 参考文献 序言 前言 本书是一本面向文科生、以Java为编程语言、以数 据分析为应用特色的面向对象程序设计教材。近年来, 人工智能、机器学习、自然语言处理、信息检索、数理 统计、数据可视化等交叉学科正在影响社会并向文科领 域广泛渗透,无论是在数字人文、社会计算、数字治理 、智慧文旅、应急情报、数据新闻等新兴研究范畴,还 是在大数据分析、社会系统仿真、应用统计学等科学研 究方法层面,数据分析均成为新文科发展的亮点。放眼 世界,全球产业、教育等正急速迈向数字化,一切与数 字经济、数字治理、数字文化相关联的业务生态正成为 当下炙手可热的风口,上述领域的决策离不开多源数据 流的汇聚分析,其底层往往与程序密不可分。特别是伴 随着各种大数据平台、机器学习新兴算法的图形用户界 面和应用编程接口(API)不断涌现,程序设计的应用 门槛越来越低,由此吸引了越来越多人士的参与,相关 生态圈日趋成熟。然而,现实中很多程序设计和数据科 学教程涉及大量数学知识,试图通过大量数学符号将原 理讲解得简洁严谨,同时体现一定的深度,但这忽视了 非理工科读者的需求,特别是给广大文科生造成了障碍 ,甚至因看不懂公式而产生自卑心理,进而产生文科生 无须编程的认识误区。必须指出,这不是文科生的问题 ,而是相关教材不适应大数据时代学生的多元需求。文 科生是否应该学习编程?这已经不是一个问题。但现实 常呈现出两种典型极端影响文科生涉足: 一种是“算法 很难,文科生数学不好,因此学不了编程”;另一种是 如今各种图形化工具插件都有,完全没有必要去学习如 何编程。就后者而言,作为数字时代的基础工具,程序 设计语言是理解数字社会、形塑数字时代的武器,如果 不理解程序设计,很难与大量数字应用及产品进行交流 ,也就无所谓批判、进一步移植、改进和构建诸如数据 分析的应用。对于前者而言,程序设计及其应用犹如“ 数学问题——程序设计算法——开源工具顶尖企业—— 中小企业二次开发——情境应用”,呈现出金字塔生态 链。正如Apple系统产业链一样,最顶端的是Apple公司 生产的各种产品以及产品底层的核心算法技术,而伴随 着产品的问世,各种中下游生态都在支持Apple,包括 产品的代工、产品外围的皮套、支架、耳塞、大屏显示 器,以及基于外围产品的仿制品等。程序设计也一样, 更多程序设计者是从事基于特定情境的二次开发乃至三 次开发的工作,由于算法的普适性、方法的封装和信息 隐藏机制,让更多人员不必了解复杂算法的细节,而只 需了解相关算法的功能,会学习API文档并运用类库, 进而去调用相关类库编写应用程序,或者运用成熟的开 源系统框架和图形用户界面进行简要的部署和应用操作 。大多数人学习编程并不是冲着创新算法去的,而是参 与到上述生态链中。既然对算法细节无须了解,近年来 ,人文社科界不断诟病算法霸权,认为算法不仅要有追 求效率的一面,也要有体现公平善治的一面,算法需要 服务于社会实践目标,故要理性地看待算法,那么对数 学公式的理解就不是必需的,为此,我们需要找到适合 文科生阅读的教程。同样是面向对象程序设计,基于因 材施教的理念,文、理科学生使用的教材内容上应该是 有区别的。但长期以来,相关教材基本由计算机或数学 背景的教师编写,相关教师总体偏理工科思维,他们默 认相关读者是面向理工科学生的。在数据科学高度发展 的今天,程序设计及其应用的教材应该具有更广泛的适 应性,特别是尊重文科生的学习体验,像包含众多数学 知识的教材不仅会让文科生望而却步,也潜在制造了数 字鸿沟,本质上影响了文科和理科的交叉融合。因此, 需要高校教师开发出适宜文科生学习的相关教材。首先 ,面向对象程序设计的知识体系强调核心内容,如变量 、方法、控制、类、继承、异常等。其次,通过更容易 理解的实例降低计算思维层次。许多理科教材在实例方 面试图提供更抽象化的数学知识讲授,特别强调计算思 维的开发。文科生的核心目标是吸收面向对象编程的知 识体系,适度抽象是程序设计的特点;但过于抽象,如 各类复杂公式或算法穿梭其间则会造成学习程序设计核 心知识的负担。Java程序设计与数据分析前言作为一门 面向对象程序设计的入门课程,本书不需要其他课程作 为知识基础,力求保持面向对象程序设计内容体例的完 整性,运用更简明的实例来引导学生入门,由于程序设 计是通过相关的输入输出在开发软件上实现的,可以即 时反馈学习效果,调整学习重点,强化难点。本书的主 要特色如下。第一,利用Java语言讲授面向对象程序设 计,强调知识体系的完整性。面向对象程序设计既可以 采用C++、Python,也可以采用Java 语言进行讲授。 在语言的入门难易程度上,Python最易,C++更难, Java语言难度适中;在语言的规范性上,Java语言优于 Python,规范性高利于形成体系;同时,Java语言有着 广泛的插件、API支持,无论是在科学分析,社会系统 仿真(例如AnyLogic、RePast平台)还是面向 导语 面向文科生、以Java为编程语言、以数据分析为应用特色的面向对象程序设计教材。利用Java语言讲授面向对象程序设计,强调知识体系完整性。_x000D_ 理论与实践相结合,力求简明扼要,重点突出。实例丰富,通过大量实例降低计算思维层次,减少抽象知识的介绍,便于理解。着眼于数据科学,以互联网数据分析讲解Java程序设计的落地应用。_x000D_ 精彩页 Chapter 3 3 方 法 本章主要内容: ● 强制类型转换; ● 无返回值方法; ● 类与方法; ● 形式参数与实际参数; ● 有返回值方法; ● 参数传递。 程序设计的一般目标是对现实情境问题转换为计算问题。这一过程中需要厘清影响 问题的关键变量,还有最终的结果变量,进而形成数学函数模型,前一个变量是自变量,后 一个变量是因变量,类似于数学中的y=f(x)。由此可以看出,开发设计函数是程序设计 中最基础、最重要的目标。Java语言中的函数称为方法。无论是面向过程的编程语言, 如C语言,还是面向对象的程序设计语言,都遵循方法的定义与使用相分离这一基本原 则。换句话说,对于同一个方法而言,可以分为定义方法和使用方法两部分。二者参与运 算需要自变量的参与,在方法头部,根据定义和使用的不同,分别有形式参数和实际参数, 二者相互联系的过程要遵循参数传递的基本原则。基于以上内容,本章介绍方法的定义 与类型、类与方法、参数类型、参数传递等知识。 3.1 强制类型转换 Java语言在必要的时候自动将int类型转换为double类型,这一过程中信息不会丢 失。相反,将浮点型转换为整型,去掉小数点后面的部分会存在舍入,即信息丢失。它无 法自动转换,需强制执行才能实现。Java语言提供了强制类型转换的语法。 (类型)变量名; double pi = 3.14159; //初始化 int x = (int) pi; //强制类型转换 24 Java 程序设计与数据分析 其中,(int)操作符将其后面的数转换为int类型。 例3-1 在main()方法中编写下列程序,输出结果如何? double pi = 3.14159; double x = (int) pi * 20.0; 输出结果: 60.0 说明:这里(int)和*均为运算符。强制类型转换运算作为单目运算,其优先级高于 算术运算*。且强制类型转换为整数通常不是执行四舍五入,而是向下取整,如0.9999, 仍为0。这里pi强制类型转换后结果为3,然后整数与浮点数20.0相乘,自动转换为浮点 数60.0。所以这个运算不仅包含强制类型转换,也包含自动类型转换。 3.2 无返回值方法 目前我们接触到的方法为Java类库中提供的方法,例如main()方法的定义。main()方 法在Java中被特别对待。作为程序的入口方法,当任何程序运行时,都会调用main()方 法。main()方法是被publicstatic所修饰的方法,Java语言中称为静态方法,与C语言中 的全局函数的提法是对等的。方法定义可以分为无返回值的方法定义和有返回值的方法 定义。在前6章中,所有的方法都将按静态方法进行处理,被publicstatic所修饰。针对 无返回值方法,语法表示如下: public static void 方法名称( 参数列表) { 语句; } 其中,void属于方法的返回值类型,它表示方法将没有返回值。所谓返回值就是方法体 最后计算的结果,如果有具体的值,并且通过return语言表示,则有返回值;否则无返回 值,对于无返回值的方法,在方法名称的前面需用void修饰。 方法名称遵循一定的命名规则。一般情况下,方法的名字可以结合编程需要任意命 名,尽量有意义,但不能使用关键字。按标识符命名惯例,Java采用驼峰式命名来给方法 命名,即方法首字母小写,之后出现的单词首字母大写,如sumMethodsLikeThis()。 方法定义不一定需要自己去开发,也可能由Java内置提供或其他外部平台引入。 Java语言开发工具包JDK 中内置了很多常用方法,这些方法不用定义就可以通过查找 API手册使用,明确该方法名和参数列表就可以直接使用。对于许多工程应用开发人员 来讲,程序设计工作的一个重要特点是充分运用外部已定义好的方法解决现实问题,他们 不需要了解该方法内部复杂的技术细节。Java程序设计中,如果需要使用方法,称为方 法调用。 参数列表,类似于数学中的sin(1/2)圆括号中的数或者表达式,称为方法的参数。 第3 章 方法 25 main()方法的参数是String[]args,即调用者需要提供一个名称为args的字符串数组 类型。参 数列表不是必需的。依据使用情形,既可以为空,也可以有一个乃至多个。没有参 数的方法称为无参方法。例如: public static void newLine() { System.out.println(""); } 这里的方法名为newLine(),其方法名后的参数为空。方法体中表示打印一个空的 字符串。 例3-2 在main()方法中调用newLine()。 pubic class App3_2{ public static void main(String[] args) { System.out.println("First line."); newLine(); //调用newLine() System.out.println("Second line."); } public static void newLine() { System.out.println(""); } } main()方法是程序运行的方法。如前所述,程序设计遵循方法的定义与使用相分 |