package net.hbase.secondaryindex.mapred; import java.util.*; import net.hbase.secondaryindex.util.Const; @SuppressWarnings("rawtypes") public class Combination { public static void main(String[] args) { String cols = "bhvr:vvmid,bhvr:search,attr:age"; String[] arr = cols.split(",", -1); Map<String, String> colVal = new HashMap<String, String>(); colVal.put("bhvr:vvmid", "12358"); colVal.put("bhvr:search", "12306"); colVal.put("attr:age", "12"); Vector<String> source = new Vector<String>(); for (String col : arr) { String cn = colVal.get(col); source.add(col + Const.ROWKEY_DEFAULT_SEPARATOR + cn); } Vector<Vector> comb = Combination.getLowerLimitCombinations(source, 2); if (null != comb && comb.size() > 0) { for (Vector v : comb) { System.out.println(v.toString().replaceAll(", ", "_") .replaceAll("\\[", "").replaceAll("\\]", "")); System.out.println(v.toString()); } } } @SuppressWarnings("unchecked") public static Vector<Vector> getAllCombinations(Vector data) { Vector allCombinations = new Vector(); for (int i = 1; i <= data.size(); i++) { allCombinations.addAll(getAllCombinations(data, i)); } return allCombinations; } @SuppressWarnings("unchecked") public static Vector<Vector> getLowerLimitCombinations(Vector data, int lowerLimit) { Vector allCombinations = new Vector(); for (int i = lowerLimit; i <= data.size(); i++) { allCombinations.addAll(getAllCombinations(data, i)); } return allCombinations; } public static Vector getAllCombinations(Vector data, int length) { Vector allCombinations = new Vector(); Vector initialCombination = new Vector(); combination(allCombinations, data, initialCombination, length); return allCombinations; } @SuppressWarnings("unchecked") private static void combination(Vector allCombinations, Vector data, Vector initialCombination, int length) { if (length == 1) { for (int i = 0; i < data.size(); i++) { Vector newCombination = new Vector(initialCombination); newCombination.add(data.elementAt(i)); allCombinations.add(newCombination); } } if (length > 1) { for (int i = 0; i < data.size(); i++) { Vector newCombination = new Vector(initialCombination); newCombination.add(data.elementAt(i)); Vector newData = new Vector(data); for (int j = 0; j <= i; j++) newData.remove(data.elementAt(j)); combination(allCombinations, newData, newCombination, length - 1); } } } }