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

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

最好不是脚本语言的奇技淫巧...Java 没辣么灵活。
4383 次点击
所在节点    程序员
24 条回复
shalk
2018-05-15 21:05:25 +08:00
n 个数组,把迭代器都取出来. 做成一个列表,整数进位一样. 例如 n 为 4,迭代器数组指向的是 0,0,0,0,再一次就是 0,0,0,1 当低位,hasnext 到头了,就进位,下一个迭代器移动,并且把本迭代器回拨到 0. 最后整个封装成一个 generator
wr410
2018-05-15 21:54:06 +08:00
你这个直接说“ CrossJoin ”或者笛卡尔积就专业了。

具体实现上面都有,就不班门弄斧了。
shalk
2018-05-15 22:45:39 +08:00
电脑上补代码
```


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Permutation {
interface Generator<T> {
T next();

boolean hasNext();
}

static class PermutationGenerator implements Generator<List<Integer>> {
final private int[] index;
final List<List<Integer>> nums;
private boolean hasNext = true;

public PermutationGenerator(List<List<Integer>> nums) {
this.nums = nums;
index = new int[nums.size()];
}

@Override
public List<Integer> next() {
List<Integer> ret = new ArrayList<>();
if (!hasNext)
return ret;

for (int i = 0; i < index.length; i++) {
ret.add(nums.get(i).get(index[i]));
}

int resetCount = 0;
for (int i = 0; i < index.length; i++) {
if (index[i] < nums.get(i).size() - 1) {
index[i]++;
break;
} else {
index[i] = 0;
resetCount++;
}
}

if (resetCount == index.length) {
hasNext = false;
}
return ret;
}

@Override
public boolean hasNext() {
return hasNext;
}
}


public static void main(String[] args) {
List<List<Integer>> data = Arrays.asList(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9));
Generator<List<Integer>> gen = new PermutationGenerator(data);
while (gen.hasNext()) {
System.out.println(gen.next());
}
}
}

```
BBCCBB
2019-07-06 21:31:00 +08:00
你可以参考 leetcode 17 题

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

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

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

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

© 2021 V2EX