有比较优雅的写法吗?

问题描述

大家好,想达到如下目的,List1 {"A1", "A2", "A3", "A4"}List2 {"B1", "B2", "B3", "B4", "B5"}List3 {"C1", "C2", "C3", "C4", "C5"}List4 {"D1", "D2", "D3"}List5 {"E1", "E2", "E3", "E4"}List6 {"F1", "F2", "F3", "F4", "F5"}A1,B1,C1,D1,E1,F1A1,B1,C1,D1,E1,F2A1,B1,C1,D1,E1,F3...A1,B1,C1,D1,E2,F1A1,B1,C1,D1,E2,F2A1,B1,C1,D1,E2,F3...实现这样的组合,除了6重循环外,有什么优雅的写法吗?

解决方案

6重循环逻辑上更简单些,不想要这种写法也是可以的,给你个参考吧;import java.util.Arrays;import java.util.List;public class Mm {/** * @param args */public static void main(String[] args) {// int[] a = new int[] { 123, 11 };List<String>[] t = new List[] { Arrays.asList("1", "2", "3", "4"),Arrays.asList("a", "b", "c"), Arrays.asList("甲", "乙", "丙", "丁") };int[] pos = new int[t.length];while (!print(t, pos)) {addpos(t, pos, pos.length - 1);}}public static void addpos(List<String>[] t, int[] pos, int p_length) {if (p_length < 0)return;if (pos[p_length] < t[p_length].size() - 1) {pos[p_length] = pos[p_length] + 1;} else {pos[p_length] = 0;addpos(t, pos, p_length - 1);}}public static boolean print(List<String>[] t, int[] pos) {boolean end = true;for (int i = 0; i < pos.length; i++) {System.out.print(t[i].get(pos[i]));end = end && t[i].size() - 1 == pos[i];}System.out.println();return end;}}
解决方案二:
来个javascript的,java的类似~var sids = [[1, 2], [2, 3], [4, 2], [7, 3], [9, 5]];var vmap = {};vmap['spec.1'] = [['a','A'],['b','B']];vmap['spec.2'] = [['e','E'],['f','F'],['k','K']];vmap['spec.4'] = [['1','1'],['2','2']];vmap['spec.7'] = [['x','x1'],['y','y2'],['z','z3']];vmap['spec.9'] = [['m','MM'],['n','NN'],['V','VV'],['O','OO'],['p','PP']];//2*3*2*3=36 var d=[];function js_fill(){ var h=1, w=sids.length; for (var i=0; i<w; i++) h*=sids[i][1]; for (var i=0; i<h; i++) d[i]=[]; var jc=1, cs=0, cf=0; for (var i=0; i<w; i++) { var x=0, n=sids[i][1], ar=vmap['spec.'+sids[i][0]]; jc*=n; cf=h/jc; cs=h/(n*cf); for (var m=0; m<cs; m++) { for (var j=0; j<n; j++) { for (var k=0; k<cf; k++) d[x++][i] = ar[j]; } } //if (x!=h) alert('[test] here x!=h [x='+x+'] [h='+h+'] >> ['+jc+' >> '+cs+' >> '+cf+' >> '+(cs*n*cf)+'] bad ~ '); } var lst = '<hr />'; for (var i=0; i<h; i++) { for (var j=0; j<w; j++) { lst += d[i][j][0]+','+d[i][j][1]+'&nbsp;&nbsp;' } lst += '<br />'; } document.write(lst);}js_fill();
解决方案三:
这是求6个列表的笛卡尔乘积,可以找找看有没有相应语言的library。以下是Python代码:list = [a, b]for x in itertools.product(*list): print x
解决方案四:
6重循环最简单了,要优雅用一些排列组合的算法,可能会慢

时间: 2024-09-20 23:01:18

有比较优雅的写法吗?的相关文章

JavaScript初学者:JavaScript初学者应注意的七个细节

  每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学者应该注意的七个细节,与大家分享.(1)简化代码JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的:    1 var car = new Object(); 2 car.colour = 'red'; 3 car.wheels = 4; 4 car.hubcaps

AS3日积月累之二:从AS1和AS2到AS3的观念转变

http://as3blog.com/as3/as3tip-new-philosophy/ AS1/2-AS3观念的转变(Meet with new philosophy)对于AS1.AS2的开发模式来说,灵活是最大的优势.然而,灵活却造成了不稳定.紊乱.这是开发复杂的.长久的项目所忌讳的.关于(AS1/2/1+2)灵活轻便与稳定持久(AS3)的权衡,我个人觉得可以理解为"鱼和熊掌不可兼得",但我希望已经习惯了AS1.AS2的朋友们不要把这个结论想得太悲观. AS3是纯粹面向对象的,相

JavaScript初学者应注意的七个细节

每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学者应该注意的七个细节,与大家分享. (1)简化代码 JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的:    1 var car = new Object(); 2 car.colour = 'red'; 3 car.wheels = 4; 4 car.hubcaps

数据分析师的必读书单

有不少人留言希望我推荐数据分析的书单,刚好即将春节,无论是假日学习还是年后,都值得充电.读书最好的时候是学生时期,其次是现在.内容按照 <如何七周成为数据分析师 > 的顺序. 数据分析是一门专业且跨越多个领域的学科,虽然我每篇公众号都足够篇幅(乃至我自己觉得啰嗦),可我还是得承认存在缺漏.如果有好书作为参考,对数据分析能力的成长更有帮助. 这份书单权作入门级推荐,如果大家有更好的欢迎留言说明.我不能保证全部看过,毕竟基础书没必要看几本,但我尽量做到客观.建议大家根据自己基础挑选,不要贪多. 大

使用AmplifyJS组件配合JavaScript进行编程的指南_基础知识

事件分发的作用 在为页面添加各类交互功能时,我们熟知的最简单的做法就是为页面元素绑定事件,然后在事件处理函数中,做我们想要做的动作.就像这样的代码: element.onclick = function(event){ // Do anything. }; 如果我们要做的动作不复杂,那么实际逻辑功能的代码,放在这里是可以的.如果今后需要修改,再到这段事件处理函数的位置来修改. 再进一步,为了做适当的代码复用,我们可能会把逻辑功能中的一部分分拆到一个函数内: element.onclick = f

javascript代码编写需要注意的7个小细节小结_javascript技巧

1. 简化代码 JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的: 复制代码 代码如下: <SPAN style="FONT-FAMILY: verdana, geneva">var car = new Object(); car.colour = 'red'; car.wheels = 4; car.hubcaps = 'spinning'; car.age = 4; </SPAN> 下面的写法可以达到同样的效果: 复制代码 代

JavaScript初学者应注意的七个细节小结_javascript技巧

每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学者应该注意的七个细节,与大家分享. (1)简化代码 JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的: 复制代码 代码如下: var car = new Object(); car.colour = 'red'; car.wheels = 4; car.hubcaps

编程的智慧(转)

编程的智慧 编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的"智慧",并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获. 反复推敲代码 有些人喜欢炫耀自己写了多少多少万行的代码,仿佛代码的数量是衡量编程水平的标准.然而,如果你总是匆匆写出代码,却从来不回头去推敲,修改和提炼,其实是不可能提

Java多线程与并发库高级应用

想快速精通多线程?看这里  http://blog.chinaunix.net/uid-540802-id-4431193.html 什么是线程         线程,是程序执行流的最小单元.是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行.在单个程序中同时运行多个线程完成不同的工作,称为多线程.当自己想