創建序列的一種方法是顯式列出其各個項。每個項都用一個逗號進行分隔,列表用方括號 "[
" 和 "]
"
括起來。例如,下面的代碼:
def weekDays = ["Mon","Tue","Wed","Thu","Fri"];
|
聲明了一個序列并將其賦給 weekDays
。我們在這個例子中使用了 def
,
因為在創建序列后我們不打算改變它的值。這里,編譯器知道我們打算創建一個“字符串序列”,因為每個項都聲明為 String
字面值。如果序列是使用 Integer
聲明的(例如,def nums = [1,2,3];
),
編譯器將知道我們打算創建“整數序列”。
您還可以顯式指定序列的類型,方法是修改序列的聲明,使其包含后跟 "[]" 的類型名稱。
def weekDays: String[] = ["Mon","Tue","Wed","Thu","Fri"];
|
這會通知編譯器 weekDays
將用來存放 String
序列(而不是單個 String
)。
您還可以在序列中聲明其他序列:
def days = [weekDays, ["Sat","Sun"]];
|
在這種情況下,編譯器將自動平展開嵌套的序列以構成單個序列,這樣上面的代碼就等效于:
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
|
還可以通過簡化表示法來更方便地創建可構成等差數列的序列。要創建一個由數字 1 至 100
構成的序列,請使用以下代碼:
def nums = [1..100];
您可以使用布爾表達式(又稱為謂詞)聲明一個為現有序列的子集的新序列。例如,請考慮以下代碼:
要創建第二個序列(基于此第一個序列中的項)但僅包含大于 2 的數字,請使用以下代碼:
def numsGreaterThanTwo = nums[n | n > 2];
|
可以將上面的代碼行用中文表示為:“從 nums
序列中選擇項值大于 2
的所有項并將這些項賦給名為 numsGreaterThanTwo
的新序列。”以粗體突出顯示的“項值大于
2”子句是謂詞。
在這些代碼中:
- 新創建的序列存儲在
numsGreaterThanTwo
中。
- 代碼
nums[n | n > 2];
中標記為粗體的部分指定要從中復制項的原始序列。在我們的示例中,nums
是原始序列的名稱。
- 這會選擇
nums
中的項,并按順序返回一個由使表達式為 true
的項構成的新序列。
- "|" 字符用來在視覺上將變量 "n" 與代碼的其余部分隔開:
nums[n |
n > 2];
- 代碼
nums[n | n > 2];
中標記為粗體的部分定義一個布爾表達式,該表達式指定將當前項復制到新序列中時需要滿足的條件。
序列中的項是按數字索引(從 0
開始)進行訪問的。要訪問單個項,請鍵入序列名稱,后跟該項的數字索引(用方括號括起來):
def 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
運算符來確定序列的大小:
以下代碼會將 "7" 輸出到屏幕上:
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(sizeof days);
|
insert
關鍵字可用于在序列中特定項的前面或后面插
入一個項。
注:從技術上講,序列是不可變的,即一經創建就永不更改。在修改序列(例如通過插入或刪除項)時,會在后臺創
建一個新序列并重新指定序列變量,這會給人一種序列已被修改的印象。
讓我們通過重新創建 days
序列來對此進行研究。請注意,我們現在用 var
來聲明變量 days
,因為我們會在創建原始序列后改變它的值:
此時,該序列僅包含一個項 "Mon"
。
我們可以使用 insert
和 into
關鍵字在該序列的末尾插入 "Tue"
:
類似地,我們也可以添加 "Fri"
、"Sat"
和 "Sun"
:
insert "Fri" into days;
insert "Sat" into days;
insert "Sun" into days;
|
該序列中現在包含:"Mon"
、"Tue"
、"Fri"
、"Sat"
和 "Sun"
。
我們還可以使用 insert
和 before
關鍵字在給定索引處的項前面插入一個項。請記住,索引是從 0 開始的,因此,在當前的序列中,"Fri"
位于索引位置
2。因此,我們可以在 "Fri"
前面插入 "Thu"
,如下所示:
insert "Thu" before days[2];
|
該序列中現在包含:"Mon"
、"Tue"
、"Thu"
、"Fri"
、"Sat"
和 "Sun"
。
要在 "Tue"
后面插入 "Wed"
,我們可以使用 insert
和 after
關鍵字:
insert "Wed" after days[1];
|
該序列現在包含一周中的每一天:"Mon"
、"Tue"
、"Wed"
、"Thu"
、"Fri"
、"Sat"
和 "Sun"
。
通過使用 delete
和 from
關鍵字可以輕松地從序列中刪除項:
該序列中現在包含:"Mon"
、"Tue"
、"Wed"
、"Thu"
、"Fri"
和 "Sat"
。
還可以刪除位于特定索引位置的項。以下代碼從該序列中刪除 "Mon"
(請記住,"Mon"
是第一個項,因此它的索引位置為 0)。
要刪除序列中的所有項,請使用后跟序列名稱的 delete
關鍵字:
請注意,delete
僅從序列中刪除項,而不從腳本中刪除 days
變量。您仍可以像以前那樣訪問 days
變量并向其中添加新項。
使用 reverse
運算符可以輕松地顛倒序列中項的次序:
var nums = [1..5];
reverse nums; // returns [5, 4, 3, 2, 1]
|
有時,您可能希望對序列進行比較,看它們是否相等。序列是按值來比較是否相等的:如果它們的長度相同而且各個項相等,則它
們相等。
讓我們創建兩個具有相同內容的序列來對此進行測試:
def seq1 = [1,2,3,4,5];
def seq2 = [1,2,3,4,5];
println(seq1 == seq2);
|
表達式 seq1 == seq2
的值為 true
,因為這兩
個序列具有相同數量的項,而且這兩個序列中每個項的值都相等。因此,這些代碼會將 "true" 輸出到屏幕上。
通過更改其中一個序列中項的數量(而不更改另一個序列),這兩個序列現在具有不同的長度:
def seq1 = [1,2,3,4,5];
def seq2 = [1,2,3,4,5,6];
println(seq1 == seq2);
|
由于第二個序列比第一個序列長,從而這兩個序列不相等,因此該腳本的輸出為 "false"。
我們還可以通過更改項的值來使兩個序列不相等(即使這兩個序列的長度仍相同):
def seq1 = [1,2,3,4,5];
def seq2 = [1,3,2,4,5];
println(seq1 == seq2);
|
由于這兩個序列不相等,因此這些代碼將再次輸出 "false"。
序列子集提供對序列某些部分的訪問。
seq[a..b]
此語法提供對位于索引 a
和索引 b
之間(含 a 和
b)各個項的訪問。以下腳本創建一個 weekend
序列,其中僅包含 "Sat"
和 "Sun"
項。
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekend = days[5..6];
|
seq[a..<b]
使用 "<" 字符可以訪問位于索引 a
和索引 b
之間(含 a,不含 b)的項。我們可以對 days
使用此方法來創建一個 weekdays
序列,其中包含項 "Mon"
至 "Fri"
。
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekdays = days[0..<5];
|
seq[a..]
通過省略第二個索引,可以訪問從索引 a
到序列末尾處的所有項。為了與上一個示例保持一致,我們可以按如下方式創建 weekend
序列:
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekend = days[5..];
|
seq[a..<]
最后,您可以使用不帶第二個索引的 "<" 來訪問從索引 a
到序列末尾處的所有項(不
含最后一項)。
def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def days2 = days[0..<];
|
此版本會創建一個 days2
序列,其中包含項 "Mon"
至
"Sat"
。
天蒼蒼,野茫茫,風吹草底見牛羊