Arrays 将元素插入J中的数组

Arrays 将元素插入J中的数组,arrays,j,Arrays,J,在J中的任意位置将元素插入数组的最佳实践是什么 我想这是一个双重问题:我的主要问题是找出如何为我想要创建的动词提供三个参数。我想写的代码的要点是 insert =. dyad : '(n {. y) , x , (n }. y)' 对于位置n。我能想到的最好的解决方案是将两个长度的长方体数组作为右参数,位置作为左参数,但这似乎有点笨拙 insert =. dyad : 0 NB. the array to be inserted is the first argument

在J中的任意位置将元素插入数组的最佳实践是什么

我想这是一个双重问题:我的主要问题是找出如何为我想要创建的动词提供三个参数。我想写的代码的要点是

insert =. dyad : '(n {. y) , x , (n }. y)'
对于位置
n
。我能想到的最好的解决方案是将两个长度的长方体数组作为右参数,位置作为左参数,但这似乎有点笨拙

insert =. dyad : 0
       NB. the array to be inserted is the first argument
       i =. > {. y
       NB. the original array is the second argument
       a =. > {: y
       (x {. a) , i , (x }. a)
)

编辑:此外,是否可以采用一个索引数组来插入项目,以及一个项目数组来插入这些索引,即一次插入多个项目?在我看来,这似乎是J所擅长的,但我不确定该如何做。

将参数装箱是一种常用的技巧。您可以对更干净的代码使用多个赋值:

f =: 3 : 0
'arg1 arg2' =: y
)
f (i.5);(i.9)    NB. arg1 is i.5, arg2 is i.9
要在
L
中的
n
位置插入数组
a
,您可以更简洁地编写:

n ({., a, }.) L
向数组中插入元素的另一种方法是使用
#。一些例子:

1 1 1j2 1 (#!.999) 1 2 3 4
  1 2 3 999 999 4

1j1 1 1j1 1 (#!.999) 1 2 3 4
  1 999 2 3 999 4

1 1 0j1 1 (#!.999) 1 2 3 4
  1 2 999 4
根据您的需要,您还可以使用许多其他技巧,如按n
n |
换档,然后使用双
取消换档。

 a,&. (n |. ]) L
(回复过长的评论) 从可读性和性能的角度来看,这两种方法大致相同。我会稍微倾向于第一个更具可读性,但可能会使用第二个

您可以使用
timespacex
动词来检查性能:例如

NB. define the different methods
f1 =: 4 :'x ({., a, }.) y
f2 =: 4 :' a,&. (x |. ]) y'

NB. set some parameters
a =: 1000 $ 9
L =: 1e6 $ 5
n =: 333456

NB. check if the too methods give identical results
(n f1 L) -: (n f2 L)
1

NB. iterate 100 times to get performance averages
100 timespacex'n f1 L'
0.00775349 2.09733e7

100 timespacex'n f2 L'
0.00796431 1.67886e7

我想您正在寻找连接词Amend
}
@bob也许我遗漏了什么,但在我看来Amend在所需索引处替换了项目,而不是插入它。很抱歉,我误解了您的请求。当然,你是对的,修正替换而不是插入。谢谢你的精彩解释,我特别喜欢移动,附加,然后撤销的想法——这太漂亮了!这些是更惯用的还是“首选的”(无论是为了运行时还是可读性)?注释太长了,所以我更新了答案。如果性能有问题,我会尽量避免插入。