算法-Java组合

code:

import org.assertj.core.util.Lists;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * https://blog.csdn.net/yhyr_ycy/article/details/52523243
 *
 * @param <E>
 */
public class Combine<E> {
    private List<List<E>> resList = Lists.newArrayList();

    public List<List<E>> combine(List<E> srcList, int require) {
        resList.clear();
        if (require < 0) {
            throw new IllegalArgumentException("");
        }
        if (srcList == null || srcList.size() == 0) {
            return Lists.newArrayList();
        }
        if (require == 1) {
            srcList.forEach(src -> resList.add(Collections.singletonList(src)));
            return resList;
        }
        if (require == srcList.size()) {
            return resList = Collections.singletonList(srcList);
        }
        combinerSelect(srcList, new ArrayList<>(), srcList.size(), require);
        return resList;
    }

    private void combinerSelect(List<E> srcList, List<E> workSpace, int n, int require) {
        List<E> copyData;
        List<E> copyWorkSpace;

        if (workSpace.size() == require) {
            List<E> newL = Lists.newArrayList();
            newL.addAll(workSpace);
            resList.add(newL);
        }

        for (int i = 0; i < srcList.size(); i++) {
            copyData = new ArrayList<>(srcList);
            copyWorkSpace = new ArrayList<>(workSpace);

            copyWorkSpace.add(copyData.get(i));
            for (int j = i; j >= 0; j--) {
                copyData.remove(j);
            }
            combinerSelect(copyData, copyWorkSpace, n, require);
        }
    }
}

test:


import com.y.Combine;
import org.assertj.core.util.Lists;
import org.junit.Test;

import java.util.List;

public class CombineTest {
    @Test
    public void test_combine() {
        Combine<String> combine = new Combine<>();
        List<String> testList = Lists.newArrayList("a", "b", "c", "d", "e");
        List<List<String>> res = combine.combine(null, 3);
        System.out.println(res);
        res = combine.combine(Lists.newArrayList(), 3);
        System.out.println(res);
        res = combine.combine(testList, 1);
        System.out.println(res);
        res = combine.combine(testList, 3);
        System.out.println(res);
        res = combine.combine(testList, 5);
        System.out.println(res);
//        res = combine.combine(testList, -1);
//        System.out.println(res);
    }
}
原文地址:https://www.cnblogs.com/yw0219/p/9074963.html