JAVA集合交叉遍历的问题

比如有5个list:
list A = {a,b,c}
list B = {d,e,f}
list c = {x,y,z,k,l}
list c = {1,2}
list c = {8,9,0,5}

要将几个list的内容进行组合,结果为 {adx18},{bey29},{efz0},{k5},{l}依次类推,实际情况可能会有更多的 list,list里元素也会更多

阅读 3.4k
3 个回答
package com.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Iter  {

    
    public static int getMaxSize(List<List<String>> list){
        if(null == list || list.size() <= 0){
            return 0;
        }
        int max = 0;
        for(List<String> cur : list){
            if(cur.size() > max){
                max = cur.size();
            }
        }
        return max;
    }
    
    public static void main(String[] args) {
        
        List<String> a = new ArrayList<String>(Arrays.asList(new String[]{"a","b","c"}));
        List<String> b = new ArrayList<String>(Arrays.asList(new String[]{"d","e","f"}));
        List<String> c = new ArrayList<String>(Arrays.asList(new String[]{"x","y","z","k","l"}));
        List<String> d = new ArrayList<String>(Arrays.asList(new String[]{"1","2"}));
        List<String> e = new ArrayList<String>(Arrays.asList(new String[]{"8","9","0","5"}));
        List<List<String>> groupList = new ArrayList<List<String>>();
        groupList.add(a);
        groupList.add(b);
        groupList.add(c);
        groupList.add(d);
        groupList.add(e);
        int index = getMaxSize(groupList);    
        for(int i = 0;i < index;i++){
            StringBuilder builder = new StringBuilder();
            for(List<String> group : groupList){
                if(group.size() > i){
                    builder.append(group.get(i));
                }
            }
            System.out.println(builder.toString());
        }
    }
}

public static List<String> combination(List<List<String>> groups) {

    if (invalid(groups) || invalid(groups.get(0))) {
        return null;
    }
    List<String> combine = groups.get(0);
    for (int i = 1; i < groups.size(); i++) {
        combine = cartesianProduct(combine, groups.get(i));
        if (combine == null) {
            return null;
        }
    }
    return combine;
}

/**
 * 两个集合元素的组合
 *
 * @param c1 集合1
 * @param c2 集合2
 * @return 组合结果
 */
public static List<String> cartesianProduct(List<String> c1, List<String> c2) {
    if (invalid(c1) || invalid(c2)) {
        return null;
    }
    List<String> combine = new ArrayList<>();
    for (int index = 0,size = c1.size(); index < size; index++) {
        String s = "";
        if (index<=c2.size()-1){
             s = c2.get(index);
        }
        combine.add(String.format("%s%s", s, c1.get(index)));

    }
    return combine;
}

/**
 * 验证集合是否无效
 *
 * @param c 集合
 * @return true 无效
 */
private static boolean invalid(List<?> c) {
    return c == null || c.isEmpty();
}

public static void main(String[] args) {
    List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
    List<String> c2 = new ArrayList<>(Arrays.asList("1", "2", "3", "4"));
    List<String> c3 = new ArrayList<>(Arrays.asList("I", "II", "III"));
    List<List<String>> collections = new ArrayList<>();
    collections.add(c1);
    collections.add(c2);
    collections.add(c3);
    List<String> combine = combination(collections);
    System.out.println(combine);
    System.out.println("actual count: " + (combine == null ? 0 : combine.size()));
}

输出结果:[I1a, II2b, III3c, 4d]
        actual count: 4

参考笛卡尔积运算。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题