多个数组,每个有多个元素,彼此两两结合,怎么写比较优雅?

2018-05-15 15:56:54 +08:00
 Luckyray
我想写接口的单元测试,每个参数都给了几个测试数据,不知道该怎么写了,想问问大家除了 N 个 for 循环还有什么办法?

最好不是脚本语言的奇技淫巧...Java 没辣么灵活。
4636 次点击
所在节点    程序员
24 条回复
agagega
2018-05-15 16:16:24 +08:00
你想实现的操作,如果我没有理解错的话,在脚本语言或者函数式语言里叫做 zip。

[1, 2, 3, 4].zip([5, 6, 7, 8])
# => [[1, 5], [2, 6], [3, 7], [4, 8]]

Java 的话,可以看看 StackOverflow#3833814
Luckyray
2018-05-15 16:38:43 +08:00
@agagega 不太一样,我的意思不知道是不是应该叫“全结合”,就是排列组合里面的组合,15,16,17,18,25,26...这样,4*4 应该是 16 个结果。
YenvY
2018-05-15 16:41:12 +08:00
看手写循环说的大概是排列组合?
function test(arys, states) {
if (arys.length) {

arys.forEach(
YenvY
2018-05-15 16:49:02 +08:00
function test(arys, states) {
if (arys.length) {
for (const elmt of arys[0]) {
states.push(elmt);
test(arys.slice(1), states)
}
states.pop();
}
else {
console.log(states);
states.pop();
}
}
pinger
2018-05-15 17:02:36 +08:00
function biu() {
return Array.prototype.reduce.call(arguments, function(i, j) {
var result = [];
a.forEach(function(i) {
b.forEach(function(j) {
result.push(i.concat([j]))
})
});
return result;
}, [[]])
}

biu([1,2,3],[4,5,6],[7,8,9])
pinger
2018-05-15 17:06:00 +08:00
function biu() {
return Array.prototype.reduce.call(arguments, function(a, b) {
var result = [];
a.forEach(function(a) {
b.forEach(function(b) {
result.push(a.concat([b]))
})
});
return result;
}, [[]])
}

biu([1,2,3],[4,5,6],[7,8,9])
重发一次
ycz0926
2018-05-15 17:06:59 +08:00
$ zip [1..10] [20..30]
[(1,20) ...]
marcong95
2018-05-15 17:11:29 +08:00
笛卡尔积?
CRVV
2018-05-15 17:27:43 +08:00
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> [(x, y) for x in a for y in b]
[(1, 5), (1, 6), (1, 7), (1, 8), (2, 5), (2, 6), (2, 7), (2, 8), (3, 5), (3, 6), (3, 7), (3, 8), (4, 5), (4, 6), (4, 7), (4, 8)]

Python 和 Haskell 的正常写法,算不上奇技淫巧吧
Java 的正常写法当然就是嵌套循环,我觉得足够优雅了
covering
2018-05-15 17:59:15 +08:00
lz 是想要一个 generator 吧?

class XG{public X next();}

while (XG.next() != null) { test(X)}
Luckyray
2018-05-15 17:59:35 +08:00
@marcong95 对对,数学没学好话都说不清楚...
RicardoScofileld
2018-05-15 18:33:11 +08:00
拿 numpy 或 pandas 处理一下?
RicardoScofileld
2018-05-15 18:34:24 +08:00
不过我记得 collections 里面有一个方法可以实现,叫 com*什么来着想不起来了
Semesse
2018-05-15 18:58:06 +08:00
python 的 itertools 就有 product
gihnius
2018-05-15 18:58:33 +08:00
Ruby:

a.product(b)
3pmtea
2018-05-15 19:12:38 +08:00
既然是 Java,那就 N 个 for 就完事儿了

如果你想搞什么骚操作的话,有这么个思路:
设计一个类,表示 N 位、size-进制的数,就可以只用一个 for,遍历这个对象的值域,达到枚举的目的
mec
2018-05-15 19:13:49 +08:00
mengyaoss77
2018-05-15 19:34:48 +08:00
用 python 预处理一遍,再用 Java 去取呗
motoko
2018-05-15 19:40:49 +08:00
不想用循环,那就递归嘛~~
def combine(pre, v2, idx):
if idx >= len(v2):
print pre
return
v1, idx = v2[idx], idx + 1
for c in v1:
combine(pre + str(c), v2, idx)

if __name__ == '__main__':
v2 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 'a', 'b']]
combine('', v2, 0)
~
wanganjun
2018-05-15 19:57:39 +08:00
偷懒的办法:把数组元素插入到内存表里面,一个数组一个表,然后连表查询......

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/454996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX