Array

通用数组数据类型。

描述

一个通用数组,可以包含多个任何类型的元素,可以通过从 0 开始的数字索引进行访问。负数索引可以用来从后面数起,就像在 Python 中一样(-1 是最后一个元素、-2 是倒数第二,等等)。

Example:

var array = ["One", 2, 3, "Four"]
print(array[0]) # One。
print(array[2]) # 3。
print(array[-1]) # Four。
array[2] = "Three"
print(array[-2]) # Three。

数组可以使用 + 操作符进行连接。

var array1 = ["One", 2]
var array2 = [3, "4"]
print(array1 + array2) # ["One", 2, 3, "Four"]

注意:+= 操作符串联将创建一个新的数组,这是有代价的。如果你想把另一个数组追加到现有的数组中,append_array 会更有效。

注意:数组总是通过引用来传递。要获得一个可以独立于原始数组而被修改的数组的副本,请使用 duplicate

注意:当用 const 声明数组时,数组本身仍然可以通过定义各个索引上的值或推/移元素而被修改。使用 const 只能防止在初始化常数后将其赋值给另一个值。

方法

Array

Array ( PoolColorArray from )

Array

Array ( PoolVector3Array from )

Array

Array ( PoolVector2Array from )

Array

Array ( PoolStringArray from )

Array

Array ( PoolRealArray from )

Array

Array ( PoolIntArray from )

Array

Array ( PoolByteArray from )

void

append ( Variant value )

void

append_array ( Array array )

Variant

back ( )

int

bsearch ( Variant value, bool before=true )

int

bsearch_custom ( Variant value, Object obj, String func, bool before=true )

void

clear ( )

int

count ( Variant value )

Array

duplicate ( bool deep=false )

bool

empty ( )

void

erase ( Variant value )

int

find ( Variant what, int from=0 )

int

find_last ( Variant value )

Variant

front ( )

bool

has ( Variant value )

int

hash ( )

void

insert ( int position, Variant value )

void

invert ( )

Variant

max ( )

Variant

min ( )

Variant

pop_at ( int position )

Variant

pop_back ( )

Variant

pop_front ( )

void

push_back ( Variant value )

void

push_front ( Variant value )

void

remove ( int position )

void

resize ( int size )

int

rfind ( Variant what, int from=-1 )

void

shuffle ( )

int

size ( )

Array

slice ( int begin, int end, int step=1, bool deep=false )

void

sort ( )

void

sort_custom ( Object obj, String func )

方法说明

PoolColorArray构建一个数组。


从一个PoolVector3Array构建一个数组。


PoolVector2Array构造一个数组。


PoolStringArray构建一个数组。


PoolRealArray构造一个数组。


PoolIntArray构建一个数组。


PoolByteArray构建一个数组。


向数组末尾追加一个元素(push_back 的别名)。


  • void append_array ( Array array )

在此数组的末尾追加另一个数组。

var array1 = [1, 2, 3]
var array2 = [4, 5, 6]
array1.append_array(array2)
print(array1) # 打印 [1, 2, 3, 4, 5, 6].

返回数组的最后一个元素。如果数组为空,则打印一个错误并返回null

注意: 调用这个函数与写入array[-1]不一样,如果数组是空的,当从编辑器运行时,按索引访问将暂停项目的执行。


使用二分法查找已有值的索引(该值不存在时,为现有顺序下的插入索引)。before 参数是可选的,为 false 时返回的索引位于数组中所有同值元素之后。

注意: 在未排序的数组上调用 bsearch 会产生预料之外的行为。


使用二分法查找以及在obj中声明的自定义比较方法,已有值的索引(该值不存在时,为现有顺序下的插入索引)。before 参数是可选的,为 false 时返回的索引位于数组中所有同值元素之后。自定义方法接收两个参数(数组中的值和要搜索的值),如果第一个参数小于第二个参数,必须返回true,否则返回false

func cardinal_to_algebraic(a):
    match a:
        "one":
            return 1
        "two":
            return 2
        "three":
            return 3
        "four":
            return 4
        _:
            return 0

func compare(a, b):
    return cardinal_to_algebraic(a) < cardinal_to_algebraic(b)

func _ready():
    var a = ["one", "two", "three", "four"]
    # `compare`是在这个对象中定义的,所以我们用`self`作为`obj`参数。
    print(a.bsearch_custom("three", self, "compare", true))# 预期的值是2。

注意: 在未排序的数组上调用bsearch_custom会导致预料之外的行为。


  • void clear ( )

清空数组。与调用 resize 时指定大小为 0 等价。


返回元素在数组中出现的次数。


返回该数组的副本。

deeptrue 时会执行深拷贝:复制所有嵌套数组和字典,不与原数组共享。为 false 时为浅拷贝,会维持对原有嵌套数组和字典的引用,所以修改副本中的子数组或者字典也会影响原数组所引用的内容。


该数组为空时,返回 true


从数组中删除第一次出现的值。要按索引删除元素,请改用 remove

注意: 该方法就地操作,不返回值。

注意: 在大型数组上,如果移除的元素靠近数组的开头(索引 0),则此方法会较慢。这是因为所有放置在删除元素之后的元素都必须重新索引。


在数组中查找指定的值,返回对应的索引,未找到时返回 -1。还可以传入搜索起始位置的索引。


在数组中逆序查找指定的值,返回对应的索引,未找到时返回 -1


返回数组的第一个元素。如果数组为空,则打印错误并返回 null

注:调用这个函数和写array[0]是不一样的,如果数组为空,从编辑器运行时按索引访问将暂停项目执行。


如果数组包含指定值时,返回 true

   ["inside", 7].has("inside") # True
   ["inside", 7].has("outside") # False
   ["inside", 7].has(7) # True
   ["inside", 7].has("7") # False

**注意:**\ 这等同于使用\ ``in``\ 操作符,如下所示。
# 将评估为 `true`。
if 2 in [2, 4, 6, 8]:
    pass

返回这个数组的整数哈希值

注意: 仅仅内容相同的数组会产生不同的哈希值, 必须要完全一致的数组才会产生相同的哈希值.


在给定的数组位置插入一个新值. 位置必须合法, 或者在数组末尾(pos == size()).

注意: 这个数组没有返回值.

注意: 在较大的数组中, 如果插入值的位置在数组偏前的位置, 这个方法的运行速度会比较慢, 因为在插入值后面所有的元素都要被重新索引.


  • void invert ( )

将数组中的元素逆序排列。


如果数组中的所有元素都是可比较的类型,返回其中的最大值。如果无法比较,返回 null


如果数组中的所有元素都是可比较的类型,返回其中的最小值。如果无法比较,返回 null


移除并返回索引position处的数组元素。如果是负数,position被认为是相对于数组的末端。如果数组是空的或者被越界访问,则保留数组不动,并返回null。当数组被越界访问时,会打印出一条错误信息,但当数组为空时,则不会。

注意: 在大的数组上,这个方法可能比pop_back慢,因为它将重新索引位于被移除元素之后的数组元素。数组越大,被移除元素的索引越低,pop_at的速度就越慢。


删除并返回数组中的末尾元素。数组为空时,返回 null。另请参阅 pop_front


移除并返回数组的第一个元素。如果数组是空的,将不会输出任何错误信息并返回null。另请参阅 pop_back

注意: 当数组元素很多时,由于 pop_front 每次调用时都要重新寻找数组所有元素的索引,所以会比 pop_back 慢很多。数组 越大,pop_front 越慢。


在数组的末端添加一个元素。参阅push_front


  • void push_front ( Variant value )

在数组的开头添加一个元素。参阅push_back

注意: 在大数组中,这个方法比push_back慢得多,因为每次调用它都会重新索引所有数组的元素。数组越大,push_front的速度就越慢。


  • void remove ( int position )

按索引从数组中移除一个元素。如果索引在数组中不存在,则什么也不会发生。要通过搜索一个元素的值来移除它,请使用erase来代替。

注意: 这个方法是就地操作,不返回值。

注意: 在大数组中,如果被删除的元素靠近数组的开头(索引0),这个方法会比较慢。这是因为所有放置在被移除元素之后的元素都要被重新索引。


  • void resize ( int size )

调整数组至包含不同数量的元素。如果数组变小则清除多余元素,变大则新元素为 null


逆序搜索数组。还可以传入搜索起始位置的索引,如果为负数,则起始位置从数组的末尾开始计算。


  • void shuffle ( )

将数组打乱,元素随机排列。该方法使用全局随机数生成器,与 @GDScript.randi 等方法一致。如果你想每次都使用新的种子,让打乱无法重现,则可以调用 @GDScript.randomize


返回数组中元素的个数。


复制函数中描述的子集并以数组形式返回,如果deeptrue,则深度复制数组。下索引和上索引是包含的,step描述了分片时索引之间的变化。


  • void sort ( )

对数组进行排序。

注意:字符串按字母顺序排序(与自然顺序相反)。当对一个以数字序列结尾的字符串数组进行排序时,这可能会导致意外的行为。请看下面的例子。

var strings = ["string1", "string2", "string10", "string11"]
strings.sort()
print(strings) # 输出 [string1, string10, string11, string2]

使用一个自定义的方法对数组进行排序。参数是一个持有该方法的对象和该方法的名称。自定义方法接收两个参数(一对来自数组的元素),并且必须返回 true 或者 false

对于两个元素 ab,如果给定的方法返回 true,元素 b 将在数组中元素 a 之后。

注意:你不能随机化返回值,因为堆排序算法期望一个确定的结果。而这样做会导致意外的行为。

class MyCustomSorter:
    static func sort_ascending(a, b):
        if a[0] < b[0]:
            return true
        return false

var my_items = [[5, "Potato"], [9, "Rice"], [4, "Tomato"]]
my_items.sort_custom(MyCustomSorter, "sort_ascending")
print(my_items) # 输出 [[4, Tomato], [5, Potato], [9, Rice]]。