算法思想是这样的。假设原始数据是N个字符串,且 N>=4。
这里假设数据是:1,2,3,4
首先找到所有的2项组合,即12,13,14,23,24,34。找的方法是这样的,先取出数据的第一项,即1,然后和后面所有的组合,即12,13,14。再取出数据的第二项,和后面的去组合,即23,24。接下来按同样的方法得到,34.
接下来我们去3项集合。也是首先取到数据的一项,即1,然后和2项集的从23开始的每一项去组合,即123,124,134. 然后在取出数据的第二项,即2,和34开始后的每一项去组合,即234.
依照此方法,就可以去到任意的长度的数据的所有组合。
这里是用JAVA实现的代码。
//原始数据 List<String> ids = new ArrayList<String>(Arrays.asList("1", "2", "3", "4")); // 保存结果 List<HashSet<String>> res = new ArrayList<HashSet<String>>(); // 保存上一次的数据 List<HashSet<String>> pre = new ArrayList<HashSet<String>>(); for (int i = 1; i <= ids.size(); i++) { // 保存本次数据 List<HashSet<String>> tm = new ArrayList<HashSet<String>>(); int m = 0; for (int ii = 0; ii < ids.size(); ii++) { if (i != 1) { for (int iii = m; iii < pre.size(); iii++) { if (!pre.get(iii).contains(ids.get(ii))) { HashSet<String> t = new HashSet<String>(Arrays.asList(ids .get(ii))); t.addAll(pre.get(iii)); tm.add(t); } else m++; } } else tm.add(new HashSet<String>(Arrays.asList(ids.get(ii)))); } res.addAll(tm); pre.clear(); pre.addAll(tm); } System.out.println(res.size()); System.out.println(res);
运行结果。
15 [[1], [2], [3], [4], [2, 1], [3, 1], [1, 4], [3, 2], [2, 4], [3, 4], [3, 2, 1], [2, 1, 4], [3, 1, 4], [3, 2, 4], [3, 2, 1, 4]]