JS++ 集合
在编写计算机程序的过程中,你经常需要将多个元素组合成某种形式的集合。JS++提供了两种集合来帮助你处理这些情况:数组和字典。它们将是本教程的重点。
数组
我们将从数组开始。建立一个名为Collections的新文件夹,然后建立一个名为 “Collections.jspp “的新文件。写入以下代码。
string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
这段代码演示了一个简单的方法来创建一个字符串数组并将其填充为四个元素。该数组被分配给一个名为friendsArray的变量,它属于string[]
类型。请注意,数组变量特别提到了数组可以包含的元素的类型:string[]
变量只能接受字符串元素的数组,而不是任何其他类型的数组。如果我们试图将一个int数组分配给string[]
变量,我们的代码将无法编译。
数组中的元素是有序的,每个元素都有一个数字索引,从0开始,每一个连续的元素都增加1。所以在 friendsArray 中,例如,”Anna “的索引是0,”Betty “的索引是1,以此类推。
数组中的每个元素都有一个索引,这是非常有用的,因为它使我们可以单独访问这些元素。为了了解这一点,让我们编写一些代码,在HTML文档中显示friendArray中的特定元素。做一个名为 “Collections.html “的第二个文件,并写上以下内容。
<!DOCTYPE html>
<title>Collections program</title>
<body>
<p id="content"></p>
<script src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="Collections.jspp.js"></script>
</body>
</html>
将Collections.html保存到你的Collections文件夹。现在回到Collections.jspp,在你已经有的那一行上再加两行。
external ;
string[] friendsArray = ["Anna", "Betty", "Chris", "David"];("#content").append(friendsArray[0], " ", friendsArray[2]);
看看这里的最后一行,特别是表达式 friendsArray[0]
和 friendsArray[2]
。这些表达式用于访问索引0和索引2的数组元素(鉴于索引编号从0开始,是数组的第一和第三元素)。如果你编译了你的代码并在浏览器中打开Collections.html,你会看到它显示 “Anna Chris”。
你也可以使用一个数组索引来改变该索引处的元素。例如,假设在创建我们的数组后,我们想把第二个元素改为 “Brian”。我们可以这样做:写
friendsArray[1] = "Brian";
锯齿状数组
JS++还允许你创建所谓的锯齿状数组(也被称为数组的数组):包含其他数组元素的数组。例如,我们可能想创建一个元素为字符串的数组。我们可以这样做。
string[][] jaggedArray = [["Anna", "Betty"], ["Chris", "David"]];
要访问jaggedArray中的一个内部数组,你将使用与之前相同的语法:例如,jaggedArray[1]
将返回包含 “Chris “和 “David “的数组。要访问一个内部数组中的一个元素,你需要指定两个索引:第一个索引表示内部数组,第二个索引表示该内部数组中的特定元素。例如,jaggedArray[1][0]
将返回 “Chris”,而jaggedArray[0][1]
将返回 “Betty”。
遍历数组
当使用数组时,你经常想对其元素进行迭代。有两种主要的方法来做到这一点。第一种是使用常规的for循环,也就是我们在第5章中看到的那种。
string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
for (int i = 0; i < friendsArray.length; ++i) {
$("#content").append(friendsArray[i], " ");
}
注意for循环的条件子句,它使用表达式friendsArray.length。这个表达式返回 friendsArray 中的元素数,所以用这个表达式来限制循环的迭代次数是有意义的。
length是一个所谓的 “getter方法 “的例子。方法是属于一个特定类的函数,而getter是一种特殊的方法,可以不使用括号来调用。我们将在第11章中更详细地研究方法(getter和其他种类)和类。length方法属于Array
注意:Array
遍历数组的另一种主要方式是使用foreach循环。
string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
foreach (string name in friendsArray) {
$("#content").append(name, " ");
}
像这样的foreach循环比普通的for循环更容易编写,但它不能像普通for循环那样让你访问每个元素的索引。因此,当决定使用哪种循环时,必须考虑是否需要访问数组的索引。
数组和变量参数
在上一章中,我们注意到函数可以有一个变量参数,这使得函数可以为该单一参数接受无限多的参数。当参数被赋予函数时,它们被存储为一个数组。下面是一个带有变量参数的函数的例子。
int add (...int numbers){
int total = 0;
foreach (int number in numbers){
total += number;
}
return total;
}
$("#content").append(add(1, 2, 3));
添加函数被声明为带有变量参数…数字。当函数被调用时,它被赋予参数1、2和3。这些参数被存储为一个名为numbers的数组,然后在函数的主体中可以被访问。在这个例子中,我们对数组中的元素进行循环,然后返回其总和。
注意:一个函数不能有一个以上的变量参数。
数组方法
在本教程的前面,我们看了Array
indexOf方法返回一个搜索元素的第一个索引,如果在数组中找不到该元素,则返回-1。
string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
$("#content").append(friendsArray.indexOf("David"));
如果数组中的元素是可排序的,那么sort方法就可以用来对数组进行排序。(关于可排序性和排序行为的更多信息,请看这里:排序方法。) 例如,我们可以这样对一个int数组进行数字升序排序。
int[] numbersArray = [7, 2, 9, 5];
numbersArray.sort();
foreach (int number in numbersArray) {
$("#content").append(number, " ");
}
要将一个或多个元素添加到一个数组的末尾,你可以使用push方法。
int[] numbersArray = [7, 2, 9, 5];
numbersArray.push(6, 5);
foreach (int number in numbersArray) {
$("#content").append(number, " ");
}
要删除一个数组中的最后一个元素,你可以使用pop方法。
int[] numbersArray = [7, 2, 9, 5];
numbersArray.pop();
foreach (int number in numbersArray) {
$("#content").append(number, " ");
}
关于Array
阵列
字典
字典是一种不同于数组的集合。主要区别在于,数组包含单个元素,而字典包含键值对。让我们来看看一些创建 JS++ 字典的代码。在你写新的代码之前,删除你在Collections.jspp中已有的代码。 现在写入以下内容。
import System;
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
在第一行,你导入了System模块。我们在下一章才会详细介绍模块,但现在关键的一点是,这个导入语句让你使用Js++标准库中的Dictionary
然而,有了导入语句,你的代码就可以编译了,它创建了一个字典,以键值的形式存储朋友的名字和他们的年龄。对于每个键-值对,键是人的名字,值是他们的年龄。这个字典的类型是 Dictionary
注意:当写JS++字典的键时,可以选择使用引号。因此,例如,不要写Dictionary
一个 dictionary 的键值对不是有序的,它们没有被分配一个索引。要访问一个特定的对,你要使用它的键。例如,如果我们想在我们的 HTML 文档中显示 Anna 的年龄和 Chris 的年龄,我们可以这样做。
import System;
external ;
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};("#content").append(friendsAges["Anna"], " ", friendsAges["Chris"]);
表达式 friendsAges[“Anna”] 返回对应于 “Anna “的值,表达式 friendsAges[“Chris”] 返回对应于 “Chris “的值。因此,如果你编译了这段代码并在浏览器中打开Collections.html,你的文档将显示 “47 35″。
你也可以用一个键来改变键值对的值。
friendsAges["Anna"] = 48;
这就把对应于 “Anna” 的值改为 48。它并没有在 friendsAges 中插入一个新的键值对,因为字典中不能有两个键值相同的对。要在字典中插入一个新的配对,你必须使用一个不同的键。
friendsAges["Emily"] = 39;
迭代字典
在字典的键和值上进行迭代是很容易的。为了迭代键值,我们使用 for…in 循环。
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
for (string name in friendsAges){
$("#content").append(name, ": ", friendsAges[name], ", ");
}
相比之下,对一个字典的值进行迭代的最简单方法是使用一个 foreach 循环。
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
foreach (int age in friendsAges){
$("#content").append(age, " ");
}
字典方法
前面我们看到Array
length 方法的工作方式正是你所期望的,鉴于 Array
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
$("#content").append(friendsAges.length);
contains 方法可以用来检查一个 dictionary 是否包含某个键。
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
if(friendsAges.contains("Anna")){
("#content").append("Anna found!");
}
else {("#content").append("Anna not found!");
}
remove方法可以用来从一个字典中删除一个特定的键和它的相关值。
Dictionary<int> friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
friendsAges.remove("Anna");
for (string name in friendsAges){
$("#content").append(name, " ");
}