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
       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

要在 a 中的 n 位置插入数组 L ,您可以更紧凑地编写:
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

关于arrays - 将元素插入J中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45392474/

相关文章:

Javascript将数组拆分为n个子数组, block 的大小并不重要

c - 减去数组

c - 如何检查方阵主对角线的元素是否相同?

macos - 如何在OS X的emacs 23中安装新模式?

j - 将集合分成两个对

objective-c - 是否有像 C++ STL 的 `transform` 这样的 Objective-C 算法?

javascript - 如何从数组中提取可比较的日期?

j - 如何在 J 中删除 csv 数据列

j - 转置方式看似不一致 | : works

j - 绘制一列精度浮点值