11

私はいくつかのオブジェクトを持っており、それぞれが異なる長さを持つことができますArrayListArrayList次の例のように順列を生成する必要があります。

私が2つ持っているとしましょうArrayList

ArrayListA にはオブジェクトa、オブジェクトがbあり、オブジェクトc
ArrayListB にはオブジェクトd、オブジェクトがありますe

次に、出力はArrayList次の組み合わせで6つの新しいものになります。

コンビネーション1オブジェクトaとオブジェクトd
コンビネーション2オブジェクトaとオブジェクトe
コンビネーション3オブジェクトbとオブジェクトd
コンビネーション4オブジェクトbとオブジェクトe
コンビネーション5オブジェクトcとオブジェクトd
コンビネーション6オブジェクトcとオブジェクトe

誰か助けてもらえますか?

4

7 に答える 7

6

グアバ 19+

Lists.cartesianProduct(List...)

:

List<Object> list1 = Arrays.asList("a", "b", "c");
List<Object> list2 = Arrays.asList("d", "e");
System.out.println(Lists.cartesianProduct(list1, list2));

出力:

[[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]]
于 2016-12-04T09:56:56.363 に答える
5

ストリームJava8あり

List<String> a = Arrays.asList("a", "b", "c");
List<String> b = Arrays.asList("d", "e");
String[][] AB = a.stream()
        .flatMap(ai -> b.stream()
                .map(bi -> new String[]{ai, bi}))
        .toArray(String[][]::new);
System.out.println(Arrays.deepToString(AB));

出力

[[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]]

として取得するにはList

List<List<String>> ll = a.stream()
        .flatMap(ai -> b.stream()
                .map(bi -> new ArrayList<>(Arrays.asList(ai, bi))))
        .collect(Collectors.toList());
于 2016-10-23T12:08:07.133 に答える
4

Iterable+Iterator の場合:

import java.util.*;

class CartesianIterator <T> implements Iterator <List <T>> {

    private final List <List <T>> lilio;    
    private int current = 0;
    private final long last;

    public CartesianIterator (final List <List <T>> llo) {
        lilio = llo;
        long product = 1L;
        for (List <T> lio: lilio)
            product *= lio.size ();
        last = product;
    } 

    public boolean hasNext () {
        return current != last;
    }

    public List <T> next () {
        ++current;
        return get (current - 1, lilio);
    }

    public void remove () {
        ++current;
    }

    private List<T> get (final int n, final List <List <T>> lili) {
        switch (lili.size ())
        {
            case 0: return new ArrayList <T> (); // no break past return;
            default: {
                List <T> inner = lili.get (0);
                List <T> lo = new ArrayList <T> ();
                lo.add (inner.get (n % inner.size ()));
                lo.addAll (get (n / inner.size (), lili.subList (1, lili.size ())));
                return lo;
            }
        }
    }
}

class CartesianIterable <T> implements Iterable <List <T>> {

    private List <List <T>> lilio;  

    public CartesianIterable (List <List <T>> llo) {
        lilio = llo;
    }

    public Iterator <List <T>> iterator () {
        return new CartesianIterator <T> (lilio);
    }
}

単純化された for ループでそれらを使用できます。

class CartesianIteratorTest {

    public static void main (String[] args) {
        List <Character> la = Arrays.asList (new Character [] {'a', 'b', 'c'});
        List <Character> lb = Arrays.asList (new Character [] {'d', 'e'});      
        List <List <Character>> llc = new ArrayList <List <Character>> ();
        llc.add (la);
        llc.add (lb);

        CartesianIterable <Character> ci = new CartesianIterable <Character> (llc);
        for (List<Character> lo: ci)
            show (lo);
    }

    public static void show (List <Character> lo) {
        System.out.print ("(");
        for (Object o: lo)
            System.out.print (o);
        System.out.println (")");
    }
}
于 2012-04-10T06:23:02.517 に答える
0

以下のように、すべての ArrayList に対してループを持つネストされた for ループを使用します。intList と stringList の 2 つの ArrayList があると仮定しています。入れ子になった 2 つの forループ (リストごとに 1 つ) を使用して、順列を生成できます。

for (Integer i : intList) {
    for (String s : stringList) {
        ...
    }
}
于 2011-11-10T16:28:03.810 に答える