正好原来做过,随便改了一下,递归方式实现,规格随便加,完全满足你的需求。
/**
* 组合,递归实现
*
* @param src 数组对象
* @param begin 从源数组中的此索引处取得一个数据并存入result中
* @param number 组合数量
* @param result 一组组合数据
* @param resultIdx result中索引变更,即每组组合数据共用result对象,仅改变此索引
* @param action 一组组合数据的访问器
*/
private static void combine(String[][] src, int begin, int number, String[][] result, int resultIdx, Consumer action) {
if (number == 0) {
action.accept(result);
return;
}
if (begin >= src.length) {
return;
}
boolean flag = true;
if(resultIdx > 0) {
String[] prevResult = result[resultIdx - 1];
String[] currSrc = src[begin];
if(prevResult[0].equals(currSrc[0])) {
flag = false;
}
}
result[resultIdx] = src[begin];
if(flag) {
resultIdx++;
combine(src, begin + 1, number - 1, result, resultIdx, action);
resultIdx--;
combine(src, begin + 1, number, result, resultIdx, action);
} else {
combine(src, begin + 1, number, result, resultIdx, action);
}
}
public static void main(String[] args) {
String[][] arr = new String[][]{
{"颜色", "红"},
{"颜色", "黄"},
{"尺码", "大"},
{"尺码", "中"},
{"尺码", "小"},
{"材质", "普通"},
{"材质", "高级"},
{"成份", "80%棉、20%聚酯纤维"},
{"成份", "100%棉"},
{"成份", "100%聚酯纤维"},
};
int spec_type_size = 0;
String spec_type = null;
for(int i = 0; i < arr.length; i++) {
if(spec_type == null || !arr[i][0].equals(spec_type)) {
spec_type = arr[i][0];
spec_type_size++;
}
}
combine(arr, 0, spec_type_size, new String[spec_type_size][], 0, (String[][] v) -> {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < v.length; i++) {
sb.append(Arrays.toString(v[i]));
if(i != v.length - 1) {
sb.append(", ");
}
}
System.out.println(sb);
});
}
结果
[颜色, 红], [尺码, 大], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 大], [材质, 普通], [成份, 100%棉]
[颜色, 红], [尺码, 大], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 红], [尺码, 大], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 大], [材质, 高级], [成份, 100%棉]
[颜色, 红], [尺码, 大], [材质, 高级], [成份, 100%聚酯纤维]
[颜色, 红], [尺码, 中], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 中], [材质, 普通], [成份, 100%棉]
[颜色, 红], [尺码, 中], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 红], [尺码, 中], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 中], [材质, 高级], [成份, 100%棉]
[颜色, 红], [尺码, 中], [材质, 高级], [成份, 100%聚酯纤维]
[颜色, 红], [尺码, 小], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 小], [材质, 普通], [成份, 100%棉]
[颜色, 红], [尺码, 小], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 红], [尺码, 小], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 红], [尺码, 小], [材质, 高级], [成份, 100%棉]
[颜色, 红], [尺码, 小], [材质, 高级], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 大], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 大], [材质, 普通], [成份, 100%棉]
[颜色, 黄], [尺码, 大], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 大], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 大], [材质, 高级], [成份, 100%棉]
[颜色, 黄], [尺码, 大], [材质, 高级], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 中], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 中], [材质, 普通], [成份, 100%棉]
[颜色, 黄], [尺码, 中], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 中], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 中], [材质, 高级], [成份, 100%棉]
[颜色, 黄], [尺码, 中], [材质, 高级], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 小], [材质, 普通], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 小], [材质, 普通], [成份, 100%棉]
[颜色, 黄], [尺码, 小], [材质, 普通], [成份, 100%聚酯纤维]
[颜色, 黄], [尺码, 小], [材质, 高级], [成份, 80%棉、20%聚酯纤维]
[颜色, 黄], [尺码, 小], [材质, 高级], [成份, 100%棉]
[颜色, 黄], [尺码, 小], [材质, 高级], [成份, 100%聚酯纤维]