如果你有多个数据元素,你可以考虑学习序列这种数据结构。这一节将为你展示怎样创建、使用和比较序列,以及访问序列的子集——切片(子序列)。
Contents
- Creating Sequences
- Creating Sequences with Boolean Expressions
- Accessing Sequence Items
- Inserting Items into a Sequence
- Deleting Items from a Sequence
- Reversing the Items in a Sequence
- Comparing Sequences
- Using Sequences Slices
Creating Sequences
创建序列
除了5种基本数据类型之外,JavaFX也提供了序列这种数据结构。序列代表着对象的有序列表,序列中的对象称为项(item,或译为元素)。序列以方括号声明,每一数据项用逗号分割。
创建序列的一种方法是显式地列出它的每一项。每一项用逗号分割,列表用方括号括起来。下面是一个例子:
var weekDays = ["Mon","Tue","Wed","Thu","Fri"];
声明了一个序列并把它赋值给变量weekDays。编译器知道我们要建一个字符串序列,因为序列中的项都是字符串。如果序列中的项是整型(例如,var nums = [1,2,3];),编译器就会认为我们希望创建一个整数的序列。
你也可以显式地指明一个序列的类型,在变量类型后面加一个[]:
var weekDays: String[] = ["Mon","Tue","Wed","Thu","Fri"];
这将告诉编译器变量weekDays将接纳一个字符串序列(跟单一的字符串相对照)。
序列也可以嵌套在其他序列中:
var days = [weekDays, ["Sat","Sun"]];
在这种情况下,编译器自动将这种嵌套的序列转化为一个序列,使上面的语句等价于:
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
创建算术序列时有一种简写格式。如创建包含1到100的序列,用下面的格式:
var nums = [1..100];
Creating Sequences with Boolean Expressions
用布尔表达式创建序列
你可以用布尔表达式,来声明一个为已知序列的子集的序列。
var nums = [1,2,3,4,5];
创建第二个序列(基于第一个序列项),仅包括大于2的数字,用下面的代码:
var numsGreaterThanTwo = nums[n | n > 2];
上面的代码可以用这样的话表达:在num序列里选择所有值大于2的项,然后赋给名为numsGreaterThanTwo的新序列。
Accessing Sequence Items
访问序列项
序列项可以通过索引号来访问,索引号从0开始。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(days[0]);
println(days[1]);
println(days[2]);
println(days[3]);
println(days[4]);
println(days[5]);
println(days[6]);
屏幕上输出如下:
Mon
Tue
Wed
Thu
Fri
Sat
Sun
同时,你可以确定序列的大小,用sizeof操作符:
sizeof days
下面的代码向屏幕上输出“7”。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(sizeof days);
Inserting Items into a Sequence
增加项
insert关键字允许你向序列中增加一个元素,在特定的元素之前,或之后。
--------------------------------------------------------------------
注意:实际上,序列是不可变的,这意味着一旦创建序列就不可更改。当修改序列的时候,例如插入或删除序列项,后台创建了一个新序列,并赋给原来的变量,给人的印象就是序列被修改了。
--------------------------------------------------------------------
让我们通过再次创建days序列来做一下探讨:
var days = ["Mon"];
此时,序列仅包含一个元素,“Mon”。
用insert和into关键字插入“Tue”到序列的结尾。
insert "Tue" into days;
类似的方法,增加“Fri”,“Sat”,“Sun”。
insert "Fri" into days;
insert "Sat" into days;
insert "Sun" into days;
序列包含了:“Mon”,“Tue”,“Fri”和“Sun”。
同样可以用insert和before关键字将元素插入特定的项前面。牢记索引号从0开始,在当前的序列里,“Fri”在索引号为2的位置。因此,我们可以将“Thu”插入到“Fri”前面,如下:
insert "Thu" before days[2];
现在序列包含:“Mon”,“Tue”,“Thu”,“Fri”,“Sat”。
为了在“Tue”后面加入“Wed”,我们可以使用insert和after关键字:
insert "wed" after days[1];
现在序列包含了一周的所有天:“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”,“Sun”。
Deleting Items from a Sequence
删除项
使用delete和from关键字可以很容易地从序列中删除项:
delete "Sun" from days;
序列现在包含:“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”。
你也可以根据索引的位置删除元素。下面的代码从序列中删除“Mon”(记住第一个元素的索引号为0)。
delete days[0];
从一个序列中删除所有的项,使用delete关键字加序列名:
delete days;
注意,delete操作只是移除序列里的项,并不删除days变量。你仍可以访问days变量并向它插入新的项。
Reversing the Items in a Sequence
转置项
你可以简单的转置项,通过reverse操作符:
var nums = [1..5];
reverse nums; // returns [5, 4, 3, 2, 1]
Comparing Sequences
比较序列
很多时候需要对比序列是否相等。序列通过“值”来判断:如果序列长度相等,并且项的值也相等,那么序列相等。
测试一下,创建两个具有相同内容的序列:
var seq1 = [1,2,3,4,5];
var seq2 = [1,2,3,4,5];
println(seq1 == seq2);
表达式“seq1 == seq2”的值为true,因为项的数量和值都相等。屏幕上打印出“true”。
改变其中一个序列,使他们的长度不相同:
var seq1 = [1,2,3,4,5];
var seq2 = [1,2,3,4,5,6];
println(seq1 == seq2);
这时输出为“false”,因为第二个序列比第一个序列的长度长,因此不相等。
也可以通过改变元素的值来使序列不相等,即使序列有相同的长度:
var seq1 = [1,2,3,4,5];
var seq2 = [1,3,2,4,5];
println(seq1 == seq2);
再次打印出“false”,因为序列不等。
Using Sequence Slices
使用序列切片(子序列)
序列切片提供了访问序列的局部内容的功能。
seq[a..b]
这样的语法可以访问从索引号a开始到索引号b结束的序列项。下面创建了一个weekend序列只包含项“Sat”,“Sun”。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekend = days[5..6];
seq[a..<b]
使用“<”字符将得到从a开始(包含a)到b结束(不包含b)的序列。我们可以在days基础上创建一个包含从“Mon”到“Fri”的序列。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekdays = days[0..<5];
seq[a..]
省略第二个索引号,访问的是从a开始到序列结束的所有项。下面的例子同样创建了weekend序列:
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekend = days[5..];
seq[a..<]
最后,你可以用“<”来访问从a开始到序列结束,但不含最后一个元素的序列。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var days2 = days[0..<];
This version creates a days2 sequence consisting of the items "Mon" through "Sat".
这将创建一个包含从“Mon”到“Sat”的序列days2。
Contents
- Creating Sequences
- Creating Sequences with Boolean Expressions
- Accessing Sequence Items
- Inserting Items into a Sequence
- Deleting Items from a Sequence
- Reversing the Items in a Sequence
- Comparing Sequences
- Using Sequences Slices
Creating Sequences
创建序列
除了5种基本数据类型之外,JavaFX也提供了序列这种数据结构。序列代表着对象的有序列表,序列中的对象称为项(item,或译为元素)。序列以方括号声明,每一数据项用逗号分割。
创建序列的一种方法是显式地列出它的每一项。每一项用逗号分割,列表用方括号括起来。下面是一个例子:
var weekDays = ["Mon","Tue","Wed","Thu","Fri"];
声明了一个序列并把它赋值给变量weekDays。编译器知道我们要建一个字符串序列,因为序列中的项都是字符串。如果序列中的项是整型(例如,var nums = [1,2,3];),编译器就会认为我们希望创建一个整数的序列。
你也可以显式地指明一个序列的类型,在变量类型后面加一个[]:
var weekDays: String[] = ["Mon","Tue","Wed","Thu","Fri"];
这将告诉编译器变量weekDays将接纳一个字符串序列(跟单一的字符串相对照)。
序列也可以嵌套在其他序列中:
var days = [weekDays, ["Sat","Sun"]];
在这种情况下,编译器自动将这种嵌套的序列转化为一个序列,使上面的语句等价于:
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
创建算术序列时有一种简写格式。如创建包含1到100的序列,用下面的格式:
var nums = [1..100];
Creating Sequences with Boolean Expressions
用布尔表达式创建序列
你可以用布尔表达式,来声明一个为已知序列的子集的序列。
var nums = [1,2,3,4,5];
创建第二个序列(基于第一个序列项),仅包括大于2的数字,用下面的代码:
var numsGreaterThanTwo = nums[n | n > 2];
上面的代码可以用这样的话表达:在num序列里选择所有值大于2的项,然后赋给名为numsGreaterThanTwo的新序列。
Accessing Sequence Items
访问序列项
序列项可以通过索引号来访问,索引号从0开始。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(days[0]);
println(days[1]);
println(days[2]);
println(days[3]);
println(days[4]);
println(days[5]);
println(days[6]);
屏幕上输出如下:
Mon
Tue
Wed
Thu
Fri
Sat
Sun
同时,你可以确定序列的大小,用sizeof操作符:
sizeof days
下面的代码向屏幕上输出“7”。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(sizeof days);
Inserting Items into a Sequence
增加项
insert关键字允许你向序列中增加一个元素,在特定的元素之前,或之后。
--------------------------------------------------------------------
注意:实际上,序列是不可变的,这意味着一旦创建序列就不可更改。当修改序列的时候,例如插入或删除序列项,后台创建了一个新序列,并赋给原来的变量,给人的印象就是序列被修改了。
--------------------------------------------------------------------
让我们通过再次创建days序列来做一下探讨:
var days = ["Mon"];
此时,序列仅包含一个元素,“Mon”。
用insert和into关键字插入“Tue”到序列的结尾。
insert "Tue" into days;
类似的方法,增加“Fri”,“Sat”,“Sun”。
insert "Fri" into days;
insert "Sat" into days;
insert "Sun" into days;
序列包含了:“Mon”,“Tue”,“Fri”和“Sun”。
同样可以用insert和before关键字将元素插入特定的项前面。牢记索引号从0开始,在当前的序列里,“Fri”在索引号为2的位置。因此,我们可以将“Thu”插入到“Fri”前面,如下:
insert "Thu" before days[2];
现在序列包含:“Mon”,“Tue”,“Thu”,“Fri”,“Sat”。
为了在“Tue”后面加入“Wed”,我们可以使用insert和after关键字:
insert "wed" after days[1];
现在序列包含了一周的所有天:“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”,“Sun”。
Deleting Items from a Sequence
删除项
使用delete和from关键字可以很容易地从序列中删除项:
delete "Sun" from days;
序列现在包含:“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”。
你也可以根据索引的位置删除元素。下面的代码从序列中删除“Mon”(记住第一个元素的索引号为0)。
delete days[0];
从一个序列中删除所有的项,使用delete关键字加序列名:
delete days;
注意,delete操作只是移除序列里的项,并不删除days变量。你仍可以访问days变量并向它插入新的项。
Reversing the Items in a Sequence
转置项
你可以简单的转置项,通过reverse操作符:
var nums = [1..5];
reverse nums; // returns [5, 4, 3, 2, 1]
Comparing Sequences
比较序列
很多时候需要对比序列是否相等。序列通过“值”来判断:如果序列长度相等,并且项的值也相等,那么序列相等。
测试一下,创建两个具有相同内容的序列:
var seq1 = [1,2,3,4,5];
var seq2 = [1,2,3,4,5];
println(seq1 == seq2);
表达式“seq1 == seq2”的值为true,因为项的数量和值都相等。屏幕上打印出“true”。
改变其中一个序列,使他们的长度不相同:
var seq1 = [1,2,3,4,5];
var seq2 = [1,2,3,4,5,6];
println(seq1 == seq2);
这时输出为“false”,因为第二个序列比第一个序列的长度长,因此不相等。
也可以通过改变元素的值来使序列不相等,即使序列有相同的长度:
var seq1 = [1,2,3,4,5];
var seq2 = [1,3,2,4,5];
println(seq1 == seq2);
再次打印出“false”,因为序列不等。
Using Sequence Slices
使用序列切片(子序列)
序列切片提供了访问序列的局部内容的功能。
seq[a..b]
这样的语法可以访问从索引号a开始到索引号b结束的序列项。下面创建了一个weekend序列只包含项“Sat”,“Sun”。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekend = days[5..6];
seq[a..<b]
使用“<”字符将得到从a开始(包含a)到b结束(不包含b)的序列。我们可以在days基础上创建一个包含从“Mon”到“Fri”的序列。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekdays = days[0..<5];
seq[a..]
省略第二个索引号,访问的是从a开始到序列结束的所有项。下面的例子同样创建了weekend序列:
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var weekend = days[5..];
seq[a..<]
最后,你可以用“<”来访问从a开始到序列结束,但不含最后一个元素的序列。
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
var days2 = days[0..<];
This version creates a days2 sequence consisting of the items "Mon" through "Sat".
这将创建一个包含从“Mon”到“Sat”的序列days2。