背景介绍:在一般项目中,我们提前知道需要循环嵌套的数组或者链表的个数,这个是非常容易实现的,
但是有时候为了完成适配性,我们不知道需要嵌套循环的数组个数.
实现嵌套循环前提:循环使用的规则单一,例如,字符串拼接
核心代码:
public List<String> nestFoeach(Collection<List<String>> values) {
StringBuilder sb = null;
List<String> urls = new LinkedList<String>();
int cSize = values.size();
int[] sizeArray = new int[cSize+1];
sizeArray[cSize]=1;
int product = 1;
int size = 1;
int index = 0;
for (List<String> list : values) {
size = list.size();
product = product*size;
sizeArray[index]=size;
index++;
}
int[] div = new int[cSize+1];
int tDiv = 1;
for(int i=cSize;i>=0;i--) {
tDiv = tDiv*sizeArray[i];
div[i]=tDiv;
}
int yCoor;
int xCoor;
int x;
int n;
for(int i =1;i<=product;i++) {
sb = new StringBuilder();
xCoor = 0;
for (List<String> list : values) {
xCoor++;
size = list.size();
yCoor = 0;
for (String param : list) {
yCoor ++;
x = i%div[xCoor-1];
if(x%div[xCoor]==0) {
n = x/div[xCoor];
if(x==0) {
n = size;
}
}else {
n=x/div[xCoor]+1;
}
if(n==yCoor) {
sb.append(param);
}
}
}
urls.add(sb.toString());
}
return urls;
}
测试1:
public static void main(String[] args) {
Collection<List<String>> values = new ArrayList<List<String>>();
List<String> oneList = new ArrayList<String>();
oneList.add("a");
oneList.add("b");
oneList.add("c");
values.add(oneList);
List<String> twoList = new ArrayList<String>();
values.add(twoList);
twoList.add("1");
twoList.add("2");
List<String> threeList = new ArrayList<String>();
values.add(threeList);
threeList.add("d");
threeList.add("e");
threeList.add("f");
threeList.add("g");
MainTest test = new MainTest();
List<String> nestFoeach = test.nestFoeach(values);
for (String string : nestFoeach) {
System.out.println(string);
}
}
结果:
a1d
a1e
a1f
a1g
a2d
a2e
a2f
a2g
b1d
b1e
b1f
b1g
b2d
b2e
b2f
b2g
c1d
c1e
c1f
c1g
c2d
c2e
c2f
c2g
测试2:
public static void main(String[] args) {
Collection<List<String>> values = new ArrayList<List<String>>();
List<String> oneList = new ArrayList<String>();
oneList.add("a");
oneList.add("b");
values.add(oneList);
List<String> twoList = new ArrayList<String>();
values.add(twoList);
twoList.add("1");
twoList.add("2");
twoList.add("3");
twoList.add("4");
List<String> threeList = new ArrayList<String>();
values.add(threeList);
threeList.add("d");
threeList.add("f");
threeList.add("g");
MainTest test = new MainTest();
List<String> nestFoeach = test.nestFoeach(values);
for (String string : nestFoeach) {
System.out.println(string);
}
}
结果:
a1d
a1f
a1g
a2d
a2f
a2g
a3d
a3f
a3g
a4d
a4f
a4g
b1d
b1f
b1g
b2d
b2f
b2g
b3d
b3f
b3g
b4d
b4f
b4g
应用场景之一:
动态拼接指定类型的url参数为完整的url路径,就是为爬虫服务的一段小功能
后言:
遇到多元数组,只要将其转换为二元数据,该