第十课基于文本的应用教学课件.ppt

上传人:本田雅阁 文档编号:3132392 上传时间:2019-07-15 格式:PPT 页数:75 大小:405.53KB
返回 下载 相关 举报
第十课基于文本的应用教学课件.ppt_第1页
第1页 / 共75页
第十课基于文本的应用教学课件.ppt_第2页
第2页 / 共75页
第十课基于文本的应用教学课件.ppt_第3页
第3页 / 共75页
第十课基于文本的应用教学课件.ppt_第4页
第4页 / 共75页
第十课基于文本的应用教学课件.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《第十课基于文本的应用教学课件.ppt》由会员分享,可在线阅读,更多相关《第十课基于文本的应用教学课件.ppt(75页珍藏版)》请在三一文库上搜索。

1、第十课:基于文本的应用,周甫 ,www.IT,学习目标,www.IT,学习目标,www.IT,1 程序交互的几种方式,程序在运行的时候,我们要给程序输入数据,程序根据输入的数据作出响应。 常见的输入方式有: 命令行参数 系统属性 标准的输入 从文件读入,www.IT,实例分析 1,问题的描述: 通过命令行参数给程序输入数据 解决方案: 当一个Java应用程序从终端启动时,用户可以提供零个或多个命令行参数。这些命令行参数都是字符串,这些字符串可以是独立的记号(如:arg1),也可以是引号之间的多个符号(“another arg“)。参数序列跟在程序类的名字后面输入;然后被存放在String 对象

2、的数组中,传递给main 方法。,www.IT,实例分析 1(续一),代码如下: class TestArgs public static void main(String args) for (int i = 0; i args.length ; i+) System.out.println(argsi); ,www.IT,实例分析 1(续二),结果,www.IT,实例分析 2,问题描述: 通过系统属性给程序传入数据 解决方案: 系统属性是另外一种在运行时向程序传递参数的机制。每个属性都是一个属性名和属性值的映射对。属性名和属性值都是字符串。Properties 类表示这样的映射。Syste

3、m.getProperties方法返回系统的属性对象。System.getProperties(String)方法返回String属性的值。 System.getProperties(String, String)方法允许你在属性名不存在时返回默认值。你可以使用递归调用PropertyNames方法遍历全部属性名的集合;对每个属性名调用getProperty方法得到所有属性的值。,www.IT,实例分析 2(续一),代码如下: import java.util.*; class TestSP / System Properties public static void main(String

4、args) Properties p=System.getProperties(); /第4行 Enumeration e=p.propertyNames(); /第5行 while(e.hasMoreElements() String name=(String)e.nextElement(); if(name.equals(“aaa“) String value=p.getProperty(name); System.out.println(“name: “+name+“ value: “+value); 分析:第4行取得系统属性的集合,第5行从属性集合中得到属性名的枚举.,www.IT,实

5、例分析 2 (续二),结果: 运行: java -Daaa=345 TestSP /-D后面是属性的名字,=后面是属性的值 ,注意是大写的D,www.IT,实例分析 3,问题描述: 标准的输入 解决方案: 多数应用都会发生人机交互。人机交互经常通过控制台文本输入/输出来完成。 Java 2 SDK 用公有类java.lang.System支持控制台I/O。 System.out是一个PrintStream对象,它指向运行Java应用程序的终端窗口。 System.in是一个InputStream对象,它指向用户的键盘。,www.IT,实例分析 3(续一),代码: import java.io.

6、*; class TestKI /Keyboard Input public static void main(String args) String s; /进行字符串的包装,就可以读取一行字符串 InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(“按 ctrl+c 键或者输入exit 退出程序!“);,www.IT,实例分析 3(续二),try s = br.readLine( ); while(

7、s != null ,www.IT,实例分析 3(续三),运行:,www.IT,实例分析 4,问题的描述: 在程序中实现文件的创建,读,写 解决方案: Input/Output(I/O)是程序中最重要的元素之一。Java技术包含了一套丰富的I/O流。这一节我们要讲解文件中字符数据的读写。我们将讲述: 创建文件对象。 操作文件对象。 读写文件流。,www.IT,实例分析 4(续一),创建一个新的File对象 File类提供了若干处理文件和获取它们基本信息的方法。在java技术中,目录也是一个文件。你可以创建一个代表目录的文件,然后用它定义另一个文件: File myFile; myFile =

8、new File(“FileName“); myFile = new File(“/“, “FileName“); File myDir = new File(“/“); myFile = new File(myDir, “FileName“); *,www.IT,实例分析 4(续二),文件测试和工具 当你创建一个File对象后,你可以使用下面任何一种方法来获取有关文件的信息: 文件名: String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo(File newN

9、ame) 目录工具: boolean mkdir() String list(),www.IT,实例分析 4(续三),文件测试: boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute() 通用文件信息和工具: long lastModified() long length() boolean delete(),www.IT,实例分析 4(续四),代码: import java.io.*; class TestReader pu

10、blic static void main(String args) /读取当前目录下的,该类的原文件 File f = new File(“TestReader.java“); /输出到当前目录下的out.java,系统会自动创建该文件 File f1= new File(“out.java“); FileReader fr = null ; FileWriter fw = null; BufferedReader br = null; PrintWriter pw = null;,www.IT,实例分析 4(续五),try fr = new FileReader(f); br = new

11、BufferedReader(fr); fw = new FileWriter(f1); pw = new PrintWriter(fw,true);/true 代表自动刷新到磁盘里 String ss = br.readLine(); while(ss != null ,www.IT,实例分析 4(续六),finally /不管发生不发生异常,都要进行IO流的关闭 try /防止发生空指针异常,也就是说在创建文件IO流之前发生异常。 if(br != null) br.close(); if(pw != null) pw.close(); catch(Exception e) e.print

12、StackTrace(); / 以上是关闭IO流最完整的代码 ,www.IT,实例分析 5,问题的描述: 通过控制台写数据到文件里 解决方案: 1,建立控制台的输入流 2,建立文件的输出流,www.IT,实例分析 5(续一),代码如下: import java.io.*; class TestKWF public static void main(String args) File file = new File(“keyout.java“); BufferedReader br = null; /要习惯性的给声明的引用类型变量初始化为null PrintWriter pw = null;,w

13、ww.IT,实例分析 5(续二),try br = new BufferedReader(new InputStreamReader(System.in) ); pw = new PrintWriter(new FileWriter(file) ); System.out.println(“按 ctrl+c 键 或者输入exit 退出程序!“); String s = null; s = br.readLine(); /如果按 ctrl+c 键,那么s=null,所以要先进行s!=null判断,不然 /会出现空指针异常(调用s.equals(“exit“)) while( s != null

14、,www.IT,实例分析 5(续三),catch(IOException e) e.printStackTrace(); finally try if(br != null) br.close(); if(pw != null) pw.close(); catch(Exception e) e.printStackTrace(); ,www.IT,2 Math类,Math类是用来支持数学计算的,它打包在java.lang包中,包含一组静态方法和两个常数,是终态(final)的,它不能被实例化。它主要包括下列方法: 分割 int ceil(double d):返回不小于d的最小整数。 int f

15、loor(double d):返回不大于d的最大整数。 int round(float f) :返回最接近f的整数(int)。 long round(double d) :返回最接近d的整数(long)。,www.IT,2 Math类(续一),极值、绝对值: double abs(double d):返回d的绝对值。对于 float,int,long有类似的函数。 double min(double d1,double d2):返回d1与d2中的小者. 对于float,int,long有类似的函数。 double max(double d1, double d2) :返回d1与d2中的大 者。

16、对于float,int,long有类似的函数。 三角函数: double sin(double d):返回d正弦。对于余弦和正切有类 似的函数cosine,tangent。 double asin(double d):返回d反正弦。对于反余弦和反 正切有类似的函数acos,atan。 double toDegrees(double r):将弧度换算成度。 double toRadians(double d):将度换算成弧度。,www.IT,2 Math类(续二),对数、指数 double log(double d):返回d的自然对数。 double exp(double d):返回以e为底的指

17、数。 其它函数 double sqrt(double d):返回d的平方根。 double pow(double d1, double d2):返回d1的 d2次幂。 double random():返回0 至 1 的随机数。 常数 PI:圆周率,double。 E:自然对数的底,double.,www.IT,课堂练习,比较2个随机数的大小。 要求:分别比较整数,单精度浮点数和双精度浮点数。,www.IT,3 String的方法,String concat(String s):返回一个新的String,即,在原来的String后面追加上s。 String replace(String old,

18、 String new):返回一个新的String,将原来的String中的old替换成new。 String substring(int start, int end):返回一个新的String,它是原来的String中从start到end的一部分。 String toLowerCase():返回一个新的String,它将原来的String中的大写字母变成小写。 String toUpperCase():返回一个新的String,它将原来的String中的小写字母变成大写。,www.IT,3 String的方法(续一),查找方法: boolean endsWith(String s):如果原

19、来的String以s为结尾,则返回true。 boolean startsWith(String s) :如果原来的String以s为开始,则返回true。 int indexOf(String s):返回String中第一次出现s偏移量。类似有lastindexOf,从串尾开始查找。 int indexOf(int ch):返回String中第一次出现ch偏移量。类似有lastindexOf,从串尾开始查找。 int indexOf(String s, int offset):返回String中从offset开始查找,第一次出现s的偏移量。类似有lastindexOf,从串尾开始查找。 in

20、t indexOf(int ch, int offset) 返回String中从offset开始查找,第一次出现ch的偏移量。类似有lastindexOf,从串尾开始查找。,www.IT,3 String的方法(续二),比较方法: boolean equals(String s):如果原String与s逐字符比较都相等,则返回true。 boolean equalsIgnoreCase(String s):如果在忽略大小写的情况下,原String与s逐字符比较都相等,则返回true。 int compareTo(String s):进行词汇比较,如果原String 小于s则返回负数;如果原St

21、ring 大于s则返回正数;如果原String 等于s则返回零。 其它方法: char charAt(int index):返回index处的字符。 int length():返回String的长度。,www.IT,4 StringBuffer类,StringBuffer对象是一个可以改变的统一编码字符串。String与StringBuffer之间没有继承关系。 构造函数 StringBuffer():创建一个空的StringBuffer. StringBuffer(int capacity) :创建一个空的StringBuffer,容量是capacity。 StringBuffer(Stri

22、ng initialString) :创建一个StringBuffer,其内容是initialString。,www.IT,4 StringBuffer类(续一),修改方法 StringBuffer append(String s):在原来的StringBuffer后面 追加上s。对于下列参数类型有重载的方法: boolean,char,char,double,float,int,long,Object。 StringBuffer insert(int offset, String s):在原来的 StringBuffer的offset处插入s.对于下列参数类型有重 载的方法:boolean,

23、 char, char, double, float, int, long, Object。 StringBuffer reverse():颠倒原StringBuffer中字符的顺序. void setCharAt(int index, char ch):将StringBuffer中的 index处设为ch。 void setlength(int newLength):设定StringBuffer的长度. *,www.IT,5 StringBuffer与String的区别,主要是效率上的区别。它们都可以表示一个字符串对象,只不过String类型的字符串对象,只要值改变,存储的空间也会改变,而S

24、tringBuffer是在原来的空间上进行修改的。所以要进行大量的字符串操作,要用StringBuffer. 而如果不是频繁操作字符串对象,两者都可以,只不过String 更方便些,因为用两个双引号就可以表示一个Sting对象。,www.IT,实例分析 6,问题的描述: String 类的使用 解决方案: String 对象是一个不可变的统一编码字符串。该类是JDK中最特殊的一个类。只要一个String对象值改变,系统会在内存堆里寻找新的空间来存放改变后的值。,www.IT,实例分析 6(续一),代码分析: class TestString public static void main(St

25、ring args) String s1 = “abc“; String s2 = “abc“;/在内存中只生成了一个对象。 /* 如果 String s2 = new String(“abc“); 会在内存中再生成一个“abc“对象 那么将第一次将输出!= 如果要想输出= 把(s1 = s2)改成(s1.equals(s2) =只能判断基本类型的值和引用类型的地址相等不相等 equals方法可以判断引用类型的值相等不相等。 */ if(s1 = s2) /地址相等的判断 System.out.println(“=“); else System.out.println(“!=“);,www.I

26、T,实例分析 6(续二),s2 = s2+“d“; /改变对象“abc“的值 if(s1 = s2) /地址相等的判断,如果输出!= 说明s2的地址改变了。 System.out.println(“=“); else System.out.println(“!=“); 编译和运行的结果为: = !=,www.IT,6 集合类的使用,收集API 收集(或容器)是代表一个对象组的单个对象,其它对象被认为是它的元素。收集用于处理多种类型对象的问题,所有的类型都有一个特殊的种类(也就是说,它们都是从一个共同父类继承来的)。Java编程语言支持收集类Vector,Bits, Stack,Hashtabl

27、e ,LinkedList等等。例如,Stack实现后进先出(LIFO)的顺序,Hashtable提供一个相关的对象数组。 收集可用于保存,处理Object类型的对象。这允许在收集中贮存任何对象。它还可以,在使用对象前、从收集中检索到它之后,使用正确的类型转换为我们所需要的对象类型。,www.IT,6 集合类的使用(续一),收集API典型地由将对象保持为下述情况的接口而组成: (Collection)收集-没有具体顺序的一组对象 (Set)设定-没有复制的一组对象 (List)列表-有序对象组,允许复制 API还包括诸如HashSet, ArraySet, ArrayList, LinkedL

28、ist和Vector等等的类,它们实现这些接口。API还提供了支持某些算法的方法,如:排序,二进制搜索,计算列表中的最小和最大等。,www.IT,6 集合类的使用(续二),Collections API的体系结构 集合是代表一组对象的单个对象。集合中的对象叫元素。 我们在程序设计中经常会用到各种各样的数据结构,如:表、映射、清单、树、集合等。显然,这些数据结构都满足集合的定义。为了方便我们处理各种各样的数据结构,Java在Java.util包中提供了一组API。这组API中的大部分类都实现了Collection接口,因此,被称作Collections API。根据它们处理的不同种类的数据结构,

29、Collections API可分为三类: Collection:一组没有顺序的对象,允许重复相同的元素. Set:一组没有顺序的对象,不允许重复相同的元素. List:一组有顺序的对象,允许重复相同的元素.,www.IT,6 集合类的使用(续三),Collections API包括诸如HashSet, ArraySet, ArrayList, LinkedList和Vector等等的类。Collections API支持常用算法:排序,二进制搜索,求最小值和最大值等等。 Collection接口和类的体系结构有助于我们理解Collections API,www.IT,实例分析 7,问题的描述

30、: Set容器的使用 解决方案: 在下面的例题中,程序声明了一个Collections API的Set 型对象,并且用它的子类HashSet初始化它。然后向Set中添加元素,打印结果。,www.IT,实例分析 7(续一),代码分析: import java.util.*; public class TestSet public static void main(String args) Set set = new HashSet(); set.add(“abc“); set.add(“abd“); set.add(“abe“); set.add(new Integer(4); set.add(

31、“abe“); /插入了相同的数据,所以会失败 set.add(new Integer(4); /同上 System.out.println(set); ,www.IT,实例分析 7(续二),编译和运行的结果为: 4,abd,abc,abe 从结果可以看出Set容器的特点:不能保存重复的数据,而且保存的是无序的数据. 请思考下面的问题: 这里的重复数据是根据什么判断两个数据是否是同一个数据? 是由对象的hashCode()和equals()方法共同决定的。请看下例:,www.IT,实例分析 7(续三),import java.util.*; class TestSet1 public stat

32、ic void main(String args) HashSet hs = new HashSet(); /保存了10个数据 for(int i = 0;i 10;i+) hs.add(new Data(); /只打印一个数据,如果Data没有覆盖其中一个方法,那么会输出10个数据 System.out.println(hs); ,www.IT,实例分析 7(续四),class Data /覆盖hashCode()方法,得到一样的hashcode public int hashCode() return 12; /覆盖equals()方法,是每个对象比较相等 public boolean e

33、quals(Object o) return true; 输出结果为: Datac,www.IT,实例分析 8,问题的描述: List 容器的使用 解决方案: 在下面的例题中,程序声明了一个Collections API的List 型对象,并且用它的子类ArrayList初始化它。然后向List中添加元素,打印结果。 注意:List允许重复的元素。,www.IT,实例分析 8(续一),代码分析: import java.util.*; class TestList public static void main(String args) /建立一个List类型的容器 List al = new

34、 ArrayList(); /放11个数据,其中有重复的 for(int k = 0;k 10;k+) al.add(“abc“+k); al.add(“abc“+4); /打印出容器里的数据 System.out.println(al); 编译和运行的结果为: abc0,abc1,abc2,abc3,abc4,abc5,abc6,abc7,abc8,abc9,abc4 从结果可以看到List容器的特点:有序的数据,可重复的数据,www.IT,实例分析 9,问题的描述: 迭代器的用法 解决方案: 可以用迭代扫描一个集合。基本的Iterator接口可以向前扫描任何集合。对于一个Set来说,它的迭

35、代是没有顺序的。对于一个List来说,它的迭代的顺序与List中元素的顺序相同,只能向前,不能后退。此外,List对象还支持ListIterator接口,允许迭代向后移动。,www.IT,实例分析 9(续一),代码分析: Import java.util.*; public class TestList2 public static void main(String args) List list = new ArrayList(); list.add(“one“); list.add(“second“); list.add(“third“); list.add(new Integer(4);

36、 list.add(new Float(5.0F); list.add(“second“); /true list.add(new Integer(4); /true /使用迭代器,来迭代容器里的所以数据,我们把Iterator叫做迭代器 Iterator iterator=list.iterator(); while(iterator.hasNext() System.out.println(iterator.next(); ,www.IT,实例分析 9(续二),运行结果: one second third 4 5.0 second 4 上面例子只用了Iterator,这种迭代器只能向后迭代

37、 容器里的数据,有时候需要向前迭代数据,那么就 的用ListIterator(列表迭代器),它可以前后滚动 容器里的数据。请看下面的例子:,www.IT,实例分析 9(续三),Import java.util.*; public class TestList3 public static void main(String args) List list = new ArrayList(); list.add(“one“); list.add(“second“); list.add(“third“); list.add(new Integer(4); list.add(new Float(5.0

38、F); list.add(“second“); /true list.add(new Integer(4); /true ListIterator iterator=list.listIterator(); System.out.println(“向下迭代容器里的数据:“); while(iterator.hasNext() System.out.println(iterator.next(); System.out.println(“向上迭代容器里的数据:“); while(iterator.hasPrevious() System.out.println(iterator.previous

39、(); ,www.IT,实例分析 9(续四),输出结果为: 向下迭代容器里的数据: one second third 4 5.0 second 4 向上迭代容器里的数据: 4 second 5.0 4 third second one,www.IT,实例分析 9(续五),用迭代器还可以修改容器里的数据,只不过只能用当前的迭代器修改,不能两个迭代器同时修改一个容器里的数据! 请看下面示例: public class TestList4 public static void main(String args) List list = new ArrayList(); list.add(“one“)

40、; list.add(“second“); list.add(“third“); list.add(new Integer(4); list.add(new Float(5.0F); list.add(“second“); /true list.add(new Integer(4); /true,www.IT,实例分析 9(续六),ListIterator listIterator = list.listIterator(); Iterator iterator = null; iterator = list.iterator(); iterator.next(); iterator.remo

41、ve();/会删除该next()返回的元素。 /用另个迭代器操作上一个迭代器改变后的数据 while(listIterator.hasNext() System.out.println(listIterator.next(); 会发生如下异常: java.util.ConcurrentModificationException,www.IT,实例分析 10,问题的描述: 映射(Maps)的用法 解决方案: 映射这种数据结构含有两个部分:关键字和值。对于每个关键字都有一个值,也就是说,一个关键字映射一个值。映射允许通过关键字访问数据结构。 Java 在Collections API的Map接口中

42、声明了一对一的映射。当向映射中插入一对关键字和值时,如果出现关键字重用,则用新值替换映射中原有的值,不在映射中增加一个元素。,www.IT,实例分析 10(续一),代码分析: import java.util.Map; import java.util.HashMap; public class TestMap public static void main(String args) Map map = new HashMap(); map.put(“abc“,new Integer(5); map.put(“abd“,new Integer(6); map.put(“abf“,new Int

43、eger(7); /会覆盖原来的值7 map.put(“abf“,new Integer(8); System.out.println(map.get(“abf“); 编译和运行的结果为: 8,www.IT,实例分析 10(续二),在应用中可以把该容器里关键字单独取出来放到一个实现Set接口的容器里,然后过滤出你所需要的关键字,然后根据这个关键字把对应的值取出来。 import java.util.Map; import java.util.*; public class TestMap1 public static void main(String args) Map map = new H

44、ashMap(); map.put(“abc“,new Integer(5); map.put(“abd“,new Integer(6); map.put(“abf“,new Integer(7); map.put(“abf“,new Integer(8);,www.IT,实例分析 10(续三),/得到关键字的集合 Set s = map.keySet(); Iterator i = s.iterator(); String str = null; while(i.hasNext() str = (String)i.next(); if(str.equals(“abf“) System.out

45、.println(map.get(str); 结果还是8 注意:这里的关键字对象还是由hashCode()和equals()方法共同决定的.,www.IT,实例分析 11,问题的描述: 排序的用法 解决方案: 对于复杂的应用,尤其是生成报表时,排序是一种必不可少的基本操作。在Java 2 Collections API中,已经实现了几种排序。 给数组排序可以使用Arrays对象的一套sort方法。 对于boolean以外的基本类型,Arrays.sort有两种变化: Arrays.sort( array)用来为整个数组排序。 Arrays.sort( array, int fromIndex,

46、 int toIndex)用来为数组的一部分排序。,www.IT,实例分析 11(续一),对于引用类型,Arrays.sort有四种种变化: Arrays.sort(Object array)用默认的比较器为整个数组排序。 Arrays.sort(Object array, int fromIndex, int toIndex)用默认的比较器为数组的一部分排序。 Arrays.sort(Object array, Comparator comparator)为整个数组排序。 Arrays.sort(Object array, int fromIndex, int toIndex, Compar

47、ator comparator)为数组的一部分排序。,www.IT,实例分析 11(续二),由于排序算法必须比较两个对象,所以使用Arrays.sort方法时要传递比较器参数。比较器有两种类型:一种是实现Comparable接口的, 另一种是实现Comparator接口的。 Comparable接口定义了一个方法: int compareTo(element, Object)。这个方法比较 Object 与element。如果Object小于element,则返回负值;如果Object大于element,则返回正值;如果Object等于element,则返回零。,www.IT,实例分析 11(续三),Comparator接口定义了两个方法: compare(e1:Object,e2:Object)int。 如果e1小于e2,则返回负值;如果e1大于e2,则返回正值;如果e1等于e2,则返回零。 equal

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1