20 Stimmen

Wie transponiert man List<List>?

Ich habe eine folgende ArrayList,

[Title,Data1,Data2,Data3]
[A,2,3,4]
[B,3,5,7]

Und diese möchte ich gerne so umwandeln,

[Title,A,B]
[Data1,2,3]
[Data2,3,5]
[Data3,4,7]

Ich bin etwas verwirrt über den Ansatz. Jeder Hinweis würde sehr geschätzt werden.

Danke.

0voto

KIC Punkte 5628

Seit get(index) könnte Ihre Leistung dramatisch beeinträchtigen, d.h. für große verknüpfte Listen würde ich die Lösung von @polygenelubricants empfehlen, aber mit einem Iterator-Ansatz.

public static <T> List<List<T>> transpose(List<List<T>> table) {
        List<List<T>> ret = new ArrayList<List<T>>();
        final int N = table.stream().mapToInt(l -> l.size()).max().orElse(-1);
        Iterator[] iters = new Iterator[table.size()];

        int i=0;
        for (List<T> col : table) {
            iters[i++] = col.iterator();
        }

        for (i = 0; i < N; i++) {
            List<T> col = new ArrayList<T>(iters.length);
            for (Iterator it : iters) {
                col.add(it.hasNext() ? (T) it.next() : null);
            }
            ret.add(col);
        }
        return ret;
    }

0voto

Ondra Žižka Punkte 39898

In Kotlin würde ein einfaches Transponieren wie folgt aussehen:

   fun transpose( matrix: List<List<String>> ) {
        return matrix.first().forEachIndexed { 
            i, _ -> matrix.map { it.getOrNull(i) }
        }
   }

Legende:

  • forEachIndexed iteriert über die Indizes der ersten Zeile.
  • Dann wird jeder dieser Indizes auf die Elemente aller Zeilen in diesem Index abgebildet. getOrNull behandelt die fehlenden Elemente in kürzeren Zeilen.
  • Das wird zurückgegeben von map() als List .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X