(已解决) 关于函数 delete

delete 函数很简单,按位置删除对应的记录,且 delete 会更改源对象 (这是不是属于 mutable 特性)。实践中按照官方函数文档操作,不会有啥问题,正确的用法出正确的结果。但我尝试了一些不正常的用法,自找了一些困惑,想不清楚了,只好向大佬们求助。为了方便省事,下文中举例都用序列 [7,8,9],用序表结果是一样的。

1、按位置删除时,位置重复,比如,

[7,8,9].delete([1,1])
[7,8,9].delete([1,-3])

此时位置 1 和位置 -3 是一样的,也就是 [1,1],[1,-3] 都是重复了同一个位置,我猜测这样写返回的结果应该是 [8,9],但运行后结果都返回[9],所以我就琢磨,应该是一个一个删除,[1,1] 的时候首先删除了 7,得到 [8,9],然后再删除当前结果中的位置 1,也就是删除 8 之后,得到了[9]。用这个逻辑去猜测位置是[1,-3] 时的结果,首先删除位置 1 得到[8,9],此时再去删除位置 -3,就不对了,-3 索引越界了,那是不是先删除位置 -3 得到[8,9],然后再去删除此时的位置 1 对应的是 8,最后得到了 9。走的通,但不一定对。再来看以下删除:

[7,8,9].delete([1,1,1])

如果按上述逻辑删除,这个结果应该返回 [],全删完了,但实际上运行后报错 java.lang.ArrayIndexOutOfBoundsException

我想到了 delete 还有一个 @n 选项,返回删除的值,于是把上述写法都加上 @n

[7,8,9].delete@n([1,1])
[7,8,9].delete@n([1,-3])

按照一开始 delete 返回的结果 [9],我猜测加了 @n 返回删除的值应该是 [7,8],但运行后发现返回的结果是 [7,7],此时同样的位置指向的是同一个值。所以,就凌乱了。

2、delete 时索引越界的问题

序列.delete(null) 或者 序表.delete(null) 都会返回源对象,delete@n(null) 时返回 null,因为没东西删除,这个很正常。我在想,索引越界时,可不可以不报错,越界的索引就当成是没有位置删,行不行? 位置参数中有正常的位置时正常删除,越界的不存在的位置就当是 null 不处理。我觉得这样会方便一些,要不然,越界报错还得事先去计算这些位置,以防止报错终止运行。比如,

[7,8,9].delete(4) 此时索引越界了,当成没位置删,返回源序列 [7,8,9]
[7,8,9].delete@n(4) 返回 null

[7,8,9].delete([1,4]) 此时有一个索引没越界,继续运行,删能删的位置,忽略越界,返回 [8,9]
[7,8,9].delete@n([1,4]) 返回 [7,null] 或者 越界的不管只返回 [7]

以上两个问题,恳请大佬们得闲时给予帮助解惑,谢谢!