有数组为:
{"111111", "222222", "333333"}
{"444444", "555555"}
{"666666", "777777"}
取每个数组中元素与之组合效果为:

void ArrayCombination(std::vector<std::set<string>> &src, std::vector<std::set<string>> &dest)
{
if (src.empty()) return;
auto addCombination = [](std::vector<std::set<string>> &v1, std::set<string> &v2)->std::vector<std::set<string>> {
std::vector<string> _v2;
for (auto &var : v2) {
_v2.push_back(var);
}
std::vector<std::set<string>> _array;
size_t _count = v1.size() * _v2.size();
for (size_t i = 0, a1 = 0, a2 = 0; i < _count; ++i) {
std::set<string> _set;
if (a1 < v1.size()) _set = v1[a1];
if (a2 < _v2.size()) _set.insert(_v2[a2]);
if (!_set.empty())
_array.push_back(_set);
a2++;
if (a2 == _v2.size()) {
a2 = 0;
++a1;
}
}
return std::move(_array);
};
for (auto &var : src[0])
dest.push_back(std::set<string>{ var });
size_t srcSize = src.size();
if (srcSize > 1) {
for (size_t i = 1; i < srcSize; ++i)
dest = addCombination(dest, src[i]);
}
}
int main()
{
std::vector<std::set<string>> src, dest;
src.push_back(std::set<string>{"111111", "222222", "333333"});
src.push_back(std::set<string>{"444444", "555555"});
src.push_back(std::set<string>{"666666", "777777"});
ArrayCombination(src, dest);
for (auto &var : dest) {
for (auto &item : var)
std::cout << item.c_str() << " ";
std::cout << std::endl;
}
system("pause");
return 0;
}
参考:
java之数组交叉遍历组合
原版本中有一问题:

修复后如下:
public class Main {
public static void main(String[] args) {
// write your code here
String [] a={"a","b","c"};
String [] b={"d","e"};
String [] c={"f","j"};
String [] d={"h","i"};
String[] add = new Main().turns(b,a, c,d);
for (String string : add) {
System.out.println(string);
}
}
/**
* 遍历组合
* @param arrays
* @return
*/
public static String[] turns(String[] ...arrays){
if(arrays.length==1){
return arrays[0];
}
if(arrays.length==0){
return null;
}
String[] target = null;
//两两遍历
for (int i = 0; i < arrays.length; i++) {
if(i==0){
target=doubleTurns(arrays[0],arrays[1]);
i++;
}else{
target=doubleTurns(target,arrays[i]);
}
}
return target;
}
/**
* 两两遍历
* @param array1
* @param array2
* @return
*/
public static String[] doubleTurns(String [] array1,String[] array2){
String [] target=new String[array1.length*array2.length];
for (int i = 0,a1=0,a2=0; i <array1.length*array2.length; i++) {
target[i]=array1[a1]+","+array2[a2];
a2++;
if(a2==array2.length){
a2=0;
a1++;
}
}
return target;
}
}
网友评论