二元数组嵌套循环算法实现

背景介绍:在一般项目中,我们提前知道需要循环嵌套的数组或者链表的个数,这个是非常容易实现的,

               但是有时候为了完成适配性,我们不知道需要嵌套循环的数组个数.

实现嵌套循环前提:循环使用的规则单一,例如,字符串拼接

核心代码:

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路径,就是为爬虫服务的一段小功能

后言:

遇到多元数组,只要将其转换为二元数据,该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值