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.

19voto

polygenelubricants Punkte 362173

Dies wird als Transposition bezeichnet. Das folgende Snippet tut, was Sie brauchen:

import java.util.*;
public class ListTranspose {
    public static void main(String[] args) {
        Object[][] data = {
            { "Title", "Data1", "Data2", "Data3" },
            { "A", 2, 3, 4 },
            { "B", 3, 5, 7 },
        };
        List<List<Object>> table = new ArrayList<List<Object>>();
        for (Object[] row : data) {
            table.add(Arrays.asList(row));
        }
        System.out.println(table); //  [[Title, Data1, Data2, Data3],
                                   //   [A, 2, 3, 4],
                                   //   [B, 3, 5, 7]]"
        table = transpose(table);
        System.out.println(table); //  [[Title, A, B],
                                   //   [Data1, 2, 3],
                                   //   [Data2, 3, 5],
                                   //   [Data3, 4, 7]]
    }
    static <T> List<List<T>> transpose(List<List<T>> table) {
        List<List<T>> ret = new ArrayList<List<T>>();
        final int N = table.get(0).size();
        for (int i = 0; i < N; i++) {
            List<T> col = new ArrayList<T>();
            for (List<T> row : table) {
                col.add(row.get(i));
            }
            ret.add(col);
        }
        return ret;
    }
}

Siehe auch

10voto

Nick Micheal Punkte 101

Hier ist meine Lösung.Dank @jpaugh's Code.Ich hoffe, dass dies Ihnen helfen wird.^_^

public static <T> List<List<T>> transpose(List<List<T>> list) {
   final int N = list.stream().mapToInt(l -> l.size()).max().orElse(-1);
   List<Iterator<T>> iterList = list.stream().map(it->it.iterator()).collect(Collectors.toList());
   return IntStream.range(0, N)
       .mapToObj(n -> iterList.stream()
       .filter(it -> it.hasNext())
       .map(m -> m.next())
       .collect(Collectors.toList()))
   .collect(Collectors.toList());
}

3voto

Zero Punkte 11

Nicht ein schneller Weg, weder die sauberste, aber mehr von kotlin-ish Code.

fun <T> List<List<T>>.transpose(): List<List<T>> {
    val result = (first().indices).map { mutableListOf<T>() }.toMutableList()
    forEach { list -> result.zip(list).forEach { it.first.add(it.second) } }
    return result
}

die erste Zeile erzeugt eine Ergebnisliste der Größe M (für die ursprüngliche Matrix NxM), während die zweite Zeile =>

  1. iteriert zunächst durch alle Listen 'a' (jede Liste Größe m)
  2. das i-te Element von a an die i-te Liste im Ergebnis anhängen.

2voto

Midhat Punkte 16900

Dies nennt man eine Transponierungsoperation. Ein Codebeispiel ist aquí Sie werden jedoch erhebliche Änderungen benötigen, da Sie eine ArrayList von Arrays haben (was ich aus Ihrer Frage schließe).

2voto

Fergal Punkte 4884

Diese Technik wird als Transponieren bezeichnet. Beispiel für eine Implementierung.

public static MyObject [][] transpose(MyObject [][] m){
    int r = m.length;
    int c = m[r].length;
    MyObject [][] t = new MyObject[c][r];
    for(int i = 0; i < r; ++i){
        for(int j = 0; j < c; ++j){
            t[j][i] = m[i][j];
        }
    }
    return t;
}

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