📜  JS++ |收藏品

📅  最后修改于: 2022-05-13 01:54:37.617000             🧑  作者: Mango

JS++ |收藏品

在编写计算机程序的过程中,您经常需要将多个元素组合成某种形式的集合。 JS++ 提供了两种集合来帮助您处理这些情况:数组字典。它们将是本教程的重点。

数组

我们将从数组开始。创建一个名为 Collections 的新文件夹,然后创建一个名为“Collections.jspp”的新文件。编写以下代码:

string[] friendsArray = ["Anna", "Betty", "Chris", "David"];

此代码演示了一种创建string数组并使用四个元素填充它的简单方法。该数组被分配给一个名为friendsArray的变量,该变量属于string[]类型。请注意,数组变量具体引用了数组可以包含的元素类型: string[]变量只能接受string元素的数组,不能接受任何其他类型的数组。如果我们尝试将int数组分配给string[]变量,我们的代码将无法编译。

数组中的元素是有序的,每个元素都有一个数字索引,从零开始,每个连续元素增加 1。例如,在friendsArray中,“Anna”的索引为 0,“Betty”的索引为 1,以此类推。

数组中的每个元素都有一个索引很有用,因为它可以单独访问元素。要了解它是如何工作的,让我们编写一些代码,在 HTML 文档中显示friendsArray中的特定元素。制作第二个名为“Collections.html”的文件并写入以下内容:


Collections program

将 Collections.html 保存到您的 Collections 文件夹中。现在返回 Collections.jspp 并在已有的行上添加两行:

external $;

string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
$("#content").append(friendsArray[0], " ", friendsArray[2]);

看看这里的最后一行,特别是表达式friendsArray[0]friendsArray[2] 。这些表达式用于访问索引 0 和索引 2 处的数组元素(数组的第一个和第三个元素,假设索引编号从零开始)。如果您编译代码并在浏览器中打开 Collections.html,您将看到它显示“Anna Chris”。

您还可以使用数组索引来更改该索引处的元素。例如,假设在创建数组后,我们想将第二个元素更改为“Brian”。我们可以这样写:

friendsArray[1] = "Brian";

锯齿状阵列

JS++ 还允许您创建所谓的交错数组(也称为数组的数组):包含其他数组作为元素的数组。例如,我们可能想要创建一个其元素是string数组的数组。我们可以这样做:

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 章中更length地介绍方法(getter 和其他类型)和类。length 方法属于Array类,这使得它可以用于数组。我们将在本教程的后面部分介绍Array类中的其他一些方法。

注意:由于称为autoboxing的过程, Array类中的方法可用于原始数组(我们在本教程中研究的那种)。当原始值自动转换为关联的“包装器”类的实例时,就会发生自动装箱。在这种情况下,当您在原始数组上使用诸如 length 之类的方法时,原始数组会自动装箱到Array包装类的实例中,从而允许使用该方法。我们将在第 13 章更详细地介绍自动装箱。

遍历数组的另一种主要方法是使用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));

add函数是用可变参数… numbers声明的。当函数被调用时,它会得到参数 1、2 和 3。这些参数存储为名为numbers的数组,然后可以在函数体中访问。在这个例子中,我们循环遍历数组中的元素,然后返回它们的总和。

注意:一个函数不能有多个可变参数。

数组方法

在本教程的前面,我们查看了Array类中的length方法,它返回数组中元素的数量。除了length之外, Array类还包含许多有用的方法,在本节中,我们将简要介绍一些核心方法: indexOfsortpushpop

indexOf方法返回搜索元素的第一个索引,如果在数组中找不到该元素,则返回 -1:

string[] friendsArray = ["Anna", "Betty", "Chris", "David"];
$("#content").append(friendsArray.indexOf("David"));

如果数组中的元素是可排序的,则可以使用sort方法对数组进行排序。 (有关可排序性和排序行为的更多信息,请参见此处: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类中方法的完整列表,请参见此处:

Array 类中的方法

字典

字典是与数组不同的集合。主要区别在于数组包含单个元素,而字典包含键值对。让我们看一些创建 JS++ 字典的代码。在编写新代码之前,请删除您在 Collections.jspp 中已有的代码。现在写下:

import System;

Dictionary friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};

在第一行,您导入System模块。在下一章之前我们不会详细介绍模块,但现在关键是这个 import 语句允许您使用Dictionary类,它位于 JS++ 标准库中。 (我们将在第 13 章介绍 JS++ 标准库。)如果没有 import 语句,后面的代码将无法编译。

但是,使用 import 语句后,您的代码会编译并创建一个字典,该字典以键值格式存储朋友的姓名和年龄。对于每个键值对,键是人的姓名,值是他们的年龄。字典的类型是Dictionary ,因为每个键值对中的值都是一个int 。除了值类型之外,我们不需要指定键类型,因为任何字典中的键类型必须始终是string

注意:为 JS++ 字典编写键时,可以选择使用引号。例如,不要写Dictionary dict = {"a": 1};你也可以写Dictionary dict = {a: 1};编译器知道您的键必须是字符串,因此如果您将它们省略,引号将被隐式假定。

字典的键值对没有排序,也没有分配索引。要访问特定对,请使用其密钥。例如,如果我们想在 HTML 文档中显示 Anna 的年龄和 Chris 的年龄,我们可以这样做:

import System;
external $;
    
Dictionary 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 friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
for (string name in friendsAges){
    $("#content").append(name, ": ", friendsAges[name], ", ");
}

相比之下,遍历字典值的最简单方法是使用foreach循环:

Dictionary friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
foreach (int age in friendsAges){
    $("#content").append(age, " ");
}

字典方法

前面我们看到Array类包含许多可以在数组上使用的有用方法。类似地, Dictionary类包含可用于字典的各种方法。在本节中,我们将简要介绍三个最重要的: lengthcontainsremove

考虑到Array类中相应方法的行为, length方法完全按照您的预期工作:它返回字典中键值对的数量:

Dictionary friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
$("#content").append(friendsAges.length);

contains方法可用于检查字典是否包含某个键:

Dictionary 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 friendsAges = {"Anna": 47, "Betty": 28, "Chris": 35, "David": 54};
friendsAges.remove("Anna"); 
for (string name in friendsAges){
    $("#content").append(name, " ");
}

有关Dictionary类中方法的完整列表,请参见此处:

Dictionary 类中的方法