0%

Java 中 Math.round的用法:

1、参数的小数点后第一位<5,运算结果为参数整数部分。
2、参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
3、参数的小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分。

Java常用方法

toRadians

作用:将以度数为单位的角度转换为以弧度为单位的角度

arraycopy(int[] arr, int star,int[] arr2, int start2, length);

具体用法:
5个参数,
第一个参数是要被复制的数组
第二个参数是被复制的数字开始复制的下标
第三个参数是目标数组,也就是要把数据放进来的数组
第四个参数是从目标数据第几个下标开始放入数据
第五个参数表示从被复制的数组中拿几个数值放到目标数组中

算术运算

加法

乘法

除法

左除

右除法

非奇异性矩阵是什么意思

点运算

关系运算

注意不等于的关系运算符是~=

成立返回1,不成立返回0

逻辑运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
% 总结:Matlab的运算都是在矩阵意义下进行的,单个数据的算术运算只是矩阵运算的一种特例
% 加减运算 :
% 矩阵之间:
A = [1,2,3;4:6]
B = [7:9;100:102]
B - A
% 矩阵和标量之间
c = 100;
B - c

% 乘法运算就只能在矩阵之间了,而且要求A的列数与B的行数相等,此时称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容:
C = [1:3;4:6];
D = [11,20;12,21]
D * C % 特别注意,两矩阵相乘,A*B不等于就是B*A。要想成功计算,一定保证是A的列数与B的行数相等。是不能交换的。

% 除法运算??在Matlab中,有两种不同的矩阵除法运算,一个是右除,一个是左除
% 书上说如果A矩阵是非奇异方阵,则B/A等效于B*inv(A),A/B等效于inv(A)*B.而这两种不同的计算方法的计算结果是不一样的。
% 但是对于两个标量来说,左除和右除的效果是一样的。

% 乘方运算:一个矩阵的乘方运算可以表示成A ^x,要求:A为方阵,x为标量

% 点运算
% 两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型。
E = A;
F = A.* E

% 关系运算
% 当两个比较量是标量时,直接比较两个数字的大小,关系成立,表达式的结果为1,否则为0
% 当两个是同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终结果是一个只有1和0的同型矩阵
% 当一个是标量,另一个是矩阵时,则把标量与矩阵中的每一个元素按标量规则进行比较,同样结果是一个只含有0和1的同型矩阵
A1 = [1,2,3;4:6];
A2 = [0:2;21:23];
A3 = (A1< A2)% 结果:[0 0 0;1 1 1]
A4 = (A2>0) % 结果:[0 1 1;1 1 1]

% 逻辑运算
% &| ~
% & :两个非零才为1
% |:一个非零则为1
% 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,结果是包含0、1的同型矩阵
% 若参与逻辑运算的是一个标量和一个矩阵,则把标量与矩阵中的每一个元素按标量规则进行比较,同样结果是一个只含有0和1的同型矩阵

% 实例: 水仙花数

m = [100:999]; % 生成所有三位正整数
m1 = rem(m,10); % 个
m2 = rem(fix(m/10),10);% 十
m3 = fix(m/100); % 百
j = find(m == m1.^3+m2.^3+m3.^3);% 是水仙花数的序号
i = find(~(m == m1.^3+m2.^3+m3.^3)); % 不是水仙花数的序号
% 然后分别传递给矩阵m
result = m(j)
result1 = m(i)

Java-异常处理和文本I/O

异常处理概述

要点提示:异常是从方法抛出的。方法的调用者可以捕获以及处理该异常

java可以让一个方法可以抛出一个异常,该异常可以被调用者捕获和处理。

(书中的例子)在这种情况下,抛出的值为new ArithmeticException(“Divisor cannot be zero”),称为一个异常。异常就是一个从异常类创建的对象。在这种情况下,异常类就是java.lang.ArithmeticException.

构造方法ArithmeticException(str)被调用用以构建一个异常,其中str是描述异常的消息。

当异常被抛出时,正常的执行流程就会被中断。就它的名字所提示的,“抛出异常”就是将异常从一个地方传递到另一个地方。调用方法的语句包含在一个try块和一个catch块中。try块包含了正常情况下执行的代码。异常被catch块所捕获。catch块中的代码执行以处理异常。之后,catch块之后的语句被执行。

throw语句类似于方法的调用,但不同于调用方法的是,它调用的是catch块。从某种意义上讲,catch块就像带参数的方法定义,这些参数匹配抛出的值的类型。但是,它不像方法,在执行catch块之后,程序控制不返回到throw语句;而是执行catch块之后的下一条语句。

catch块的头部
catch(xxxException ex)
标识符ex的作用就像是方法中的参数。所以这个参数称为catch块的参数。ex之前的类型指定了catch块可以捕获的异常类型。一旦捕获该异常,就能从catch块体中的参数访问这个抛出的值。
try-throw-catch块的模版如下
-w732

一个异常可能是通过try块中的trow语句直接抛出,或者调用一个可能会抛出异常的方法而抛出

异常类型

要点提示:异常使对象,而对象都采用类来定义。异常的根类是java.lang.Throwable。

注意: 类名Error、Exception和RuntimeException有时候容易引起混淆。它们都是异常,这里讨论的错误都是发生在运行时。
Throwable类是所有异常的根。所有的java异常都直接或间接地继承自Throwable。可以通过继承
Exception或者Exception的子类来创建自己的异常类。

异常类分为三种主要类型:

  • 系统异常(system error)是由java虚拟机抛出的,用Error类表示。Error类描述的是内部系统错误。这样的错误很少发生。如果发生,除了可以通知用户以及尽量稳妥地终止程序外,几乎什么都不能做。
  • 异常(exception)是用Exception类表示的,它描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。
    -w922
  • 运行时异常(runtime exception)是用RuntimeException类表示的。它描述的是程序设计错误,例如,错误的类型转换、访问一个越界数组或数值错误。运行时异常通常是由Java虚拟机抛出的。
  • -w951
    RuntimeException和Error以及它们的子类都被称为免检异常。所有其他异常都被称为必检异常,意思是说编译器会强制程序猿通过try-catch块处理它们,或者在方法头进行声明。

大多数情况下,免检异常都会反映出程序设计上不可恢复的逻辑错误。

免检异常可能在程序的任何一个地方出现。

为避免过多地使用try-catch模块,java语言不强制要求程序猿编写代码捕获或声明免检异常。

关于异常处理的更多知识

要点提示: 异常的处理器是通过当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到的。

java的异常处理模型基于三种操作: 声明一个异常(declaring an exception)、抛出一个异常(throw an exception)和捕获一个异常(catching a exception)
-w909

声明异常

在java中,当前执行的语句必属于某个方法。Java解释器调用main方法开始执行一个程序。
每个方法都必须声明它可能抛出的必检异常的类型,因此java不要求在方法显式声明Error和RuntimeException。但是,方法要抛出的其他异常都必须在方法头中显式声明,这样,方法的调用者会被告知有异常。

在方法中声明一个异常,要在方法头中使用关键字throws。

public void myMethod() throws IOException

如果方法可能会抛出多个异常,就可以在关键字throws之后添加一个用逗号分隔的异常列表。

注意: 如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常。

抛出异常

检测到错误的程序可以创建一个合适的异常类型的i实例并抛出它,这就称为一个异常。
示例:
-w740
注意: 通常,Java API中的每个异常至少有两个构造方法: 一个无参构造方法和一个带有描述这个异常的String参数的构造方法。这个参数就叫做异常消息(额exception message),它可以用getMessage()获取。

提示: * 声明异常的关键字是throws, 抛出异常的关键字是throw *

捕获异常

-w827
如果在执行try块的过程中没有出现异常,则跳过catch子句。

异常处理器: try块中的某条语句抛出异常,java就会跳过try中剩余的语句,然后开始查找处理这个异常的代码的过程。处理这个异常的代码称为异常处理器。

寻找处理器的过程称为捕获一个异常。

下面截图是详细说明
-w920
-w902

注意: 一个通用的父类可以派生出各种异常类。如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。
-w865
-w890

从异常中获取信息

异常对象包含过于异常的有价值的信息。

Throwable类
-w827
stackTraceElement[] 中的每个元素表示一个方法调用
stackTraceElement[] 数组中的元素有下列的方法可以调用:

  • getMethodName() 获得每个元素的方法
  • getClassName() 获得每个元素的类名
  • getLineNumber() 获得每个元素的异常行号

示例学习: 声明、抛出和捕获异常

不管是否在方法头中声明,每个方法都能抛出RuntimeException异常(免检异常)

注意: 在异常事件中,执行仍然会继续。如果处理器没有捕获到这个异常,程序会突然中断。

如果方法抛出RuntimeException和Error之外的异常,那么此方法就必须在try-catch块内调用

finally 语句

要点提示: 无论异常是否产生,finally子句总是会被执行的。
finally子句的语法:
-w739
在任何情况下,finally块中的代码都会被执行,不论try块中是否出现异常或者是否被捕获。
-w888

链式异常

要点提示: 和其他异常一起抛出一个异常
catch块重新抛出原始的异常。有时候,可能需要同原始异常一起抛出一个新异常(带有附加信息),这称为链式异常。

似乎是先抛出新异常,然后再抛出原始异常。

创建自定义异常类

要点提示: 可以通过能够派生出java.lang.Exception 类来定义个自定义异常类

java提供相当多的异常类,尽量不要使用它们而不要创建自己的异常类。

当遇到不能用预定义的异常类恰当描述问题,那么就可以通过派生Exception类或其他子类。
-w944

提示:
Java API中的大多数异常都包含两个构造方法:一个无参构造方法和一个带消息参数的构造方法。

要创建一个InvalidRadiusException类,必须传递一个半径。

File类

本章介绍如何使用File类获取文件/目录的属性以及删除和重命名文件/目录,以及创建目录。
要点提示: File类包含了获得一个文件/目录的属性,以及对文件/目录进行改名和删除的方法。

存储在程序中的数据是暂时的,当程序终止时它们就会丢失。为了能够永久地保存程序中创建的数据,需要将它们存储到磁盘或其他永久存储设备的文件中。

在文件系统中,每个文件都存放在一个目录中。

  • 绝对文件名
    是由文件名和它的完整路径以及驱动器字母组成。

绝对文件是依赖机器的。

  • 相对文件名是相对于当前工作目录的。对于相对文件名而言,完整目录被忽略。

File类意图提供了一种抽象,这种抽象是指以不依赖机器的方式来处理很多依赖于机器的文件和路径名的复杂性。

File类包含许多获取文件属性的方法,以及重命名和删除文件和目录的方法。

但是,File类不包含读写文件内容的方法。
-w908

File类是文件名及其目录路径的一个包装类
-w862

可以用File类的isDirectory()方法来判断这个对象是否表示一个目录,还可以使用isFile()方法来判断这个对象是否表示一个文件名。

警告:在Windows中目录的分隔符是反斜杠\,但是在Java中,反斜杠是一个特殊字符,应该写成\的形式。

注意:构建一个File实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的File实例。可以调用File实例上的exists()方法来判断这个文件是否存在。

在程序中,不要直接使用绝对文件名,因为这样可能会使程序不能在其他平台上工作。

应该使用于当前目录相关的文件名。

斜杠/是Java的目录分隔符,这点和UNIX是一样的。

文件输入和输出

要点提示: 使用Scanner类从文件中读取文本数据,使用PrintWriter类向文本文件输入数据。

File对象封装了文件或路径的属性,但是它既不包括创建文件的方法,也不包括从/向文件读/写数据(称为数据输入输出,简称I/O)的方法。

为了完成I/O操作,需要使用恰当的I/O类创建对象。这些对象包含从/向文件读/写数据的方法。

文本文件本质上是存储在磁盘上的字符。

使用PrintWriter写数据

java.io.PrintWriter类可用来创建一个文本文件写入数据。首先,必须为一个文本文件创建一个PrintWriter对象。
-w615

PrintWriter对象上有print、println和printf方法,可以使用它们向文件写入数据。
-w916

Java强制要求编写代码来处理I/O异常。

System.out.println();是控制台的标准Java对象。

必须使用close()方法关闭文件。如果没有调用该方法,数据就不能正确地保存在文件中。

使用try-with-resources 自动关闭资源

程序员经常会忘记关闭文件。JDK 7 提供了下面的新的try-with-resources 语法来自动关闭文件。
-w458

关键字try后声明和创建了一个资源。
注意: 资源放在括号中。资源必须是AutoCloseable的子类型,比如PrintWriter,具有一个close方法。

资源的声明和创建必须是在同一行语句中,可以在括号中进行多个资源的声明和创建。紧接着就是资源声明的块中的语句使用资源。快结束后,资源的close()方法自动调用以关闭资源。使用try-with-resources不仅可以避免错误,还可以简化代码。

使用Scanner读数据

Scanner类用来从控制台读取字符串和基本数据类型数值。
Scanner可以将输入分为由空白字符串分隔的标记。为了能从键盘读取,需要为System.in创建一个Scanner。

为了从文件中读取,为文件创建一个Scanner,如下
Scanner input = new Scanner(new File(filename));

如同给出了Scanner中常用的方法。
-w854

从文件中读取数据使没有必要管斌输入文件,但这样做是一种释放文件占用的资源的好方法。可以使用try-with-resources语法重写该程序。

scanner中默认分隔符是空格,可以将分隔符理解为标记。

Scanner 如何工作

nextInt()等方法都被称为标记读取方法。因为它们会读取用分隔符分隔开的标记。默认情况下,分隔符是空格。
可以使用useDelimiter(String regex)方法设置新的分隔模式。

输入方法的工作原理:
一个标记方法首先跳过任意分隔符,然后读取一个以分隔符结束的标记。然后,对于nextByte,nextShort等,这个标记就分别被自动地转换为一个byte,short等类型。对于next()方法而言是无须做转换的。如果标记和期望的类型不匹配,就会抛出一个运行异常java.util.InputMismathcException.

方法next()和nextLine()都会读取一个字符串。前者读取一个由分隔符分隔的字符串,但是后者会读取一个以换行符结束的行。

注意:行分隔符是由系统定义的,在WIndows平台上是\r\n, 而在UNIX上是\n。

为了得到特定平台上的行分隔符,使用
String lineSeparator = System.getProperty(“line.separator”);

如果从键盘输入,每行就以回车键(Enter key)结束,它对应\n字符。

有关nextLine()的问题
-w904

可以使用Scanner类从文件或者键盘读取数据。也可以使用Scanner类从一个字符串扫描数据。

实例学习: 替换文本

-w887

从Web上读取数据

要点提示: 如同从电脑中的文件读取数据一样,也可以从Web上的文件中读取数据
URL全名:Uniform Resource Locator, 统一资源定位器

为了读取一个文件,首先要使用java.net.URL类的构造方法,为该文件创建一个URL对象。

要让URL类来识别一个有效的URL,前缀http:// 是必须的。

创建一个URL对象后,可以使用URL类中定义的openStream()方法来打开输入流和用输入流创建如下Scanner对象。

Scanner input = new Scanner(url.openStream());
(这里的意思是input就是给定url的内容)

实例学习: Web 爬虫

要点提示: 学习开发一个程序,可以跟随超链接来遍历Web。
World Wide Web,缩写为WWW、W3或者Web,是一个因特网上的相互链接的超文本文档。使用Web浏览器,可以查看一个文档,以及跟随超链接查看其他文档。

Web爬虫,可以跟随超链接来自动遍历Web的程序。

客户程序从一个Web服务器上获取文件。

程序的算法如下:
-w1048

JavaScript

  1. HTML 定义了网页的内容
  2. CSS 描述了网页的布局
  3. JavaScript 网页的行为

静态方法和实例方法的问题:

有static修饰的是静态方法,没有static修饰的方法是实例方法。

静态方法可以访问静态变量和其他静态方法,不可以访问实例方法,实例变量;实例方法可以访问实例变量、其他实例方法、静态变量、静态方法。(记住这一点是很有必要的。)

静态代码块

如果初始化静态变量不是简单常量,需要进行计算才能初始化,可以使用静态(static)代码块,静态 代码块在类第一次加载时执行,并只执行一次。

1
2
3
4
5
//静态代码块的格式如下:
static{
System.out.println("静态代码块被调用...");
//还可以再这里初始化静态变量
}

1
2
3
4
5
6
7
8
9
10
11
12
// 2.22 字符串插入、删除、替换
// 插入
StringBuffer str = new StringBuffer("Today is a good day!");
str.insert(11," very ");
System.out.println(str);// Today is a very good day!
//删除和替换
StringBuffer str1 = new StringBuffer("Today is a good day!");
StringBuffer str2 = new StringBuffer("Today is a good day!");
StringBuffer str3 = new StringBuffer("Today is a good day!");
System.out.println(str1.delete(0, 5));// is a good day!
System.out.println(str2.delete(0, 5));// is a good day!
System.out.println(str3.replace(0,5,"Tomorrow "));//Tomorrow is a good day!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// 2.21
// 可变字符串:可变字符串在追加、删除、修改、插入和拼接等操作时不会产生新的对象
// Java中提供了两个可变字符串类型,StringBuffer and StringBuilder,中文翻译为字符串缓冲区
// 理解:字符串长度和字符串缓冲区
// 字符串长度和字符串缓冲区容量区别。字符串长度是指在字符串缓冲区中目前所包含字符 串长度,
// 通过length()获得;字符串缓冲区容量是缓冲区中所能容纳的最大字符数,通过capacity() 获得。
// 当所容纳的字符超过这个长度时,字符串缓冲区自动扩充容量,但这是以牺牲性能为代价 的扩容。
// 字符串长度和字符串缓冲区容量示例代码:
StringBuilder nameString = new StringBuilder();
System.out.println(nameString.length());
System.out.println(nameString.capacity());//长度为零,而容量为16

StringBuilder nameString1 = new StringBuilder("xiaolei");
System.out.println(nameString1.length());
System.out.println(nameString1.capacity());//长度为7,而容量为16

//字符串缓冲区初始容量是16,超过之后会扩容,现在通过一个for循环来证明这个事情
StringBuilder teStringBuilder = new StringBuilder();
for(int i = 0;i < 17;i++) {
teStringBuilder.append(8);
System.out.println("包含的字符串长度为:" + teStringBuilder.length());
System.out.println("字符串缓冲区容量为:" + teStringBuilder.capacity());
}
//由输出结果我们可以看到,最后当字符串长度为17的时候,字符串缓冲区的容量变成了34

// 字符串追加——append
// 添加字符串
StringBuilder stringBuilder = new StringBuilder();
System.out.println(stringBuilder.append("Hello").append(" ").append("World!"));
// 添加布尔值,转义符和空对象
StringBuffer stringBuffer = new StringBuffer();
Object object = null;
System.out.println(stringBuffer.append(false).append("\t").append(object));
// 添加数值
StringBuffer numBuffer = new StringBuffer();
int i = 0;
while (i < 10) {
numBuffer.append(i);
i++;
System.out.println(numBuffer);

}
/*Output
* 0
16
7
23
包含的字符串长度为:1
字符串缓冲区容量为:16
包含的字符串长度为:2
字符串缓冲区容量为:16
包含的字符串长度为:3
字符串缓冲区容量为:16
包含的字符串长度为:4
字符串缓冲区容量为:16
包含的字符串长度为:5
字符串缓冲区容量为:16
包含的字符串长度为:6
字符串缓冲区容量为:16
包含的字符串长度为:7
字符串缓冲区容量为:16
包含的字符串长度为:8
字符串缓冲区容量为:16
包含的字符串长度为:9
字符串缓冲区容量为:16
包含的字符串长度为:10
字符串缓冲区容量为:16
包含的字符串长度为:11
字符串缓冲区容量为:16
包含的字符串长度为:12
字符串缓冲区容量为:16
包含的字符串长度为:13
字符串缓冲区容量为:16
包含的字符串长度为:14
字符串缓冲区容量为:16
包含的字符串长度为:15
字符串缓冲区容量为:16
包含的字符串长度为:16
字符串缓冲区容量为:16
包含的字符串长度为:17
字符串缓冲区容量为:34
Hello World!
false null
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789
*/

字符串比较和截取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// 字符串比较
String s11 = "xiaolei";
String s12 = "zlei";
String s13 ="Xiaolei";


//1 比较相等
//1.1 包括大小写
System.out.println(s11.equals(s12));//flase
System.out.println(s11.equals(s13));//flase
//1.2 忽视大小写
System.out.println(s11.equalsIgnoreCase(s13));//true

//2 比较大小
//2.1 不忽略大小写
System.out.println(s11.compareTo(s12));//20;依次比较两字符串相应位置的ASCII码的大小。如果相同比较下一位,如果不同就返回此位置字符与参照字符的ASCII码的差值。如果完全相同,就返回0
//2.2 忽略大小写
// 使用compareToIgnoreCase起到忽略大小写的作用

//3 比较前缀和后缀
//3.1 比较前缀boolean startsWith();
System.out.println(s11.startsWith("i"));//flase
System.out.println(s11.startsWith("x"));//true

//3.2 比较后缀
System.out.println(s11.endsWith("i"));//true
System.out.println(s11.endsWith("x"));//flase

// 比较前后缀小实例
int docNumbers = 0,javaNumbers=0;
String [] docFloder = {"javaTest.doc","PythonTest.docx","MatlabTest.m","javaFinal.ppt"};
for(String doc: docFloder) {
if (doc.endsWith(".doc")) {
docNumbers++;
}
}
for (String doc: docFloder) {
if(doc.startsWith("java")) {
javaNumbers++;
}
}
System.out.println("doc文档个数为 "+docNumbers);
System.out.println("java相关文档格个数为 "+javaNumbers);

// 知识补充:trim() tool and toLowerCase() tool
// trim() 去掉字符串前后空白
// toLowerCase() 将字符串全部转化为小写
System.out.println("ABCDEFG".toLowerCase());
System.out.println(" abcdefg ");
System.out.println(" abcdefg ".trim().toUpperCase());//去除字符串空白以后再将字符串全部转化为大写

/*Output:
false
false
true
-2
false
true
true
false
doc文档个数为 1
java相关文档格个数为 2
abcdefg
abcdefg
ABCDEFG
*/


// 字符串截取
// 1 String substring(int beginIndex) //唯一参数为指定开始索引,这一方法会截取从开始索引到字符串末尾的子字符串
// 2 String substring(int beginIndex, int endIndex) //包含两个参数,开始索引和结束索引,需要注意的是所截取的字符串包括开始索引处的字符,但是不包括结束索引处的字符
//coding:
String s_jiequString = "ABCDEFGHIGKLMNOPQRST";
System.out.println(s_jiequString.substring(4));
System.out.println(s_jiequString.substring(4, 9));
/*Output:
* EFGHIGKLMNOPQRST
* EFGHI
*/

// 知识补充 :使用split方法分割字符串
//split :参数是字符串,返回值是String[]
String s_fengeString = "abdabcdbafaga";
String[] s_fenge_results= s_fengeString.split("a");
for (String s_fenge_result:s_fenge_results) {
System.out.println(s_fenge_result);
}
/*Output
bd
bcdb
f
g
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
% 双精度(double):8字节;单精度(single):4字节
% 复数还可以使用函数来产生复数??complex;complex接收两个参数,前一个是实部,后一个是虚数;前一个参数可以为零,但是后面的参数不行
% inf和-inf来表示正无穷大和负无穷大;除法运算中除数为0或者运算结果溢出都会导致inf或者-inf的结果。
x=exp(1000000)
x=log(0)
% 上述两行代码的输出结果分别为:Inf,-Inf

% NaN用来表示一个既不是实数也不是复数的数值。NAN是Not A Number的缩写。类似0/0,inf/inf这样的表达式得到的结果均为NAN
inf/-inf
nan

% 逻辑类型
% 逻辑类型用1和0来表示。
% 函数logical()来得到逻辑类型的数值。它可以把任何非零的数值转换为逻辑true(1),反过来也可以
x = logical(-1)
% x = logical 1

% 字符和字符串
% Matlab中规定用char数据类型来表示一个字符串。一个char类型的1*n的数组则可以称为字符串String。Matlab中char类型都是以2字节的unicode字符来存储的
% 可以使用一对单引号来表示字符串:
str = "I love china!"
% 也可以使用char函数来构造字符串,下面的代码将得到字符串'AB'
str=char([65 66])

% 函数句柄
% 是用来提供间接调用函数的数据类型。函数句柄可以转递给其他函数以便该函数所代表的函数就可以被调用。函数句柄还可以储存起来,以便以后利用。
% 函数句柄可以用符号@后面跟着函数名来表示。下面的函数句柄使得自定义变量可以用来代替tan函数的功能
f=@tan
jieguo=f(pi/2)

% 结构体类型
% 结构体是根据属性名组织起来的不同类型数据的集合。
% 有一种容易与结构体类型混淆的数据类型是单元数组类型。它们之间既有相同点,也有不同点:“单元数组类型,它是一种特殊类型的MATLAB 7.0数组,
% 它的每一个元素叫做单元,而每一个单元包含MATLAB 7.0数组。结构体和单元数组的共同之处在于它们都提供了一种分级存储机制来存储不同类型的数据,
% 不同之处是组织数据的方式不一样。结构体数组里的数据是通过属性名来引用的,而在单元数组里,数据是通过单元数组下标引用来操作的。”
% 结构体数组是由数据容器组成的数组,这种数组容器称为结构体的属性。结构体的任何一个属性可以包含任何一种类型的数据。
% 和其他数据类型一样,结构体也是一个数组,一个单独的结构体就是一个1*1结构体数组。
% 可以构造任何维数和形状的结构体数组

% 结构体构造
% 1 利用赋值语句
Student(1).Name='xiaoming';
Student(1).Score=100;
Student(1).fees=[6500,10000];

% 在上面的基础上把结构体数组扩展成1*2的结构体

Student(2).Name='xiaolei';
Student(2).Score=100;
Student(2).fees=[6500,10000];
Student(1) %多维结构数组输出时要用括号加上标量
Student(2)

% 2 利用函数struct()来定义
% (1)单独使用struct函数
Student(3)=struct('Name','xiaohong','Score',99,'fees',[]);
Student(3)
% struct函数和repmat函数配合使用
% struct函数的输入为单元数组(后两种没有搞懂暂时)


% 访问结构体数组的数据
Personel=struct('Name',{'xiaolei','dalei','zhonglei'},'Score',{[100,8,100],[0,60,90],[100,50,100]});
New=Personel(1:2)% 生成新的结构体
News=New(1)% 访问新结构体的第一维数据
New(2).Name% 访问第一维数据的Name值
Personel(3).Score(2)% 访问第三个人的Score中的第三个值
Personel.Name % 用于访问结构体数组中所有元素的某个属性
% 使用矩阵合并符来合并上面输出的结果
Personel_hebing=[Personel.Name]% 'xiaoleidaleizhonglei'
% 也可以把它们合并在一个单元数组中
Personel={Personel.Name} % {'xiaolei'} {'dalei'} {'zhonglei'}


% 单元数组类型
% 1 单元数组的构造
% (1)左标志法
c{1,1}='nianchu';
c{1,2}=eye(3,3);
c{2,1}=@sec;
c{2,2}=false;
c{3,1}=true;
c

% 2.21
% (2)右标志法
% 右标志法和左标志法类似,只是将左边的标志符{}用括号代替,而在右边添加标志符即可
% 代码实现:
a(1,1)={"xiaochu"};
a(1,2)={eye(4,4)};
a(2,1)={@tan};
a(2,2)={[]};
% 或者下面这样:
b={"chuntian",[341,434];'dream','weiling'};
b

% 知识补充:eye()函数的用法——返回单位矩阵:当eye(m,n)中m和n参数不相等时,单位矩阵会出现全0行或列
% 1 返回N*N的单位矩阵
% 2 返回M*N的单位矩阵
% 3 返回和给定矩阵一样大小的单位矩阵
% 4 无参数时返回标量1
% 代码实现:
a1=eye(3)
a2=eye(2,3)
a3=eye([2,3])
a4=eye(size(b))
a4=eye()
% 补充:~eye(m,n)为eye(m,n)中1,0完全对换

% 显示单元数组的方法:
% 1 直接用数组的名字
% 2 使用函数celldisp()——使用此函数会隔行依次输出数组中的元素
% 法2代码实现
celldisp(a)
% 说明:celldisp函数的显示格式与直接输入单元组名的显示格式是不同的。celldisp函数更适用于具有大量数据的单元数组的显示

% 单元数组的读取
% 1 读取全面c数组中{1,1}处的字符串:
Str=c{1,1}
% 2 读取单元数组中若干个单元的数据,例如读取第二行的数据:
c(2,:)
% 读取单元数组的第一列
c(:,2)

% 单元数组的删除
% 将空矩阵赋给单元数组的某一行或者某一列是可以删除这一行或者这一列
% 删掉c单元数组中第二列的值
c(:,2)=[]

% 矩阵的基本操作
% Matlab是基于矩阵运算的一个软件,所有数据均以二维矩阵或高维数组的形式存储,Matlab又称为矩阵实验室

% 名词介绍:
% 标量:1*1的矩阵
% 向量: 1*n的矩阵
% 空矩阵: 至少有一堆的长度为0的矩阵称为空矩阵,用[]表示
Number=1.5;
whos Number



% 矩阵的构造
% 1 简单矩阵构造(略)
% 2 特殊矩阵构造:
% 举例:
% ones——产生矩阵元素全为1的矩阵
% zeros——产生矩阵元素全为0的矩阵
% eye——上面已经介绍过了
ones(2)
ones(2,3)
zeros(2)
zeros(2,3)
% diag 把向量转化为对角矩阵或者得到矩阵的对角元素
% magic 产生魔方矩阵,即每行、每列之和相等的矩阵
% rand 产生0-1均匀分布的随机数(此函数是以机器时间作为随机种子的,因而每次运行得到的结果都是不同的 )
% randn 产生均值为0,方差为1高斯分布的随机数
% randperm 产生整数1-n的随机排列
% compan 长生多项式的伴随矩阵
% Diga之对角矩阵和对角元素
% 形成对角矩阵
Strs='I will be a successful man'
Value=[9 9 9 2 7 2]
X=diag(Strs,-1)
X=diag(Value,0)
% 获得对角元素
Values=diag(X,0)
% 注意:当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
% 如果k的值缺失,则默认为主对角