如何转置List ?

我有一个以下的ArrayList,

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

我想像这样转换这个,

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

我对这种方法感到有点困惑。 任何提示都会非常感激。

谢谢。

这称为换位。 以下代码片段可满足您的需求:

 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> table = new ArrayList>(); 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  List> transpose(List> table) { List> ret = new ArrayList>(); final int N = table.get(0).size(); for (int i = 0; i < N; i++) { List col = new ArrayList(); for (List row : table) { col.add(row.get(i)); } ret.add(col); } return ret; } } 

也可以看看

  • 维基百科/移调

这称为转置操作。 代码示例在这里 ,但是需要进行重大修改,因为你有一个ArrayList of Arrays(我从你的问题推断)

也许这样的事情

 List> list = new ArrayList>(firstList.size()); for(int i = 0; i < firstList.size(); i++) { list.add(Arrays.asList( firstList.get(i), secondList.get(i), thirdList.get(i)) ); } 

数学背后:你需要转置矩阵。 如果你使用二维数组或“列表列表”更容易,这与集合几乎相同。 数组列表也可以工作,但稍微有些混乱。

这篇维基百科文章展示了一些换位算法。

该技术称为转置。 实现示例。

 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; } 

你需要使用二维数组。 看这里

检查所有列表是否具有相同的大小。

将信息放在Matrix(例如List with List元素)中以获取列表的数量和列表的大小。

使用旋转的大小信息创建一个新的Matrix。 (3×4到4×3)

实现2 For循环并将元素放入新矩阵中。

如果是用于数据迁移任务,如果大小不是太大,您可以考虑使用友好的电子表格。

对于矩阵操作的东西,jScience库有矩阵支持。 如果只是转换一个矩阵,这将是过度的,但这取决于需要做什么。

您是否有固定数量的ArrayLists并且它们是否具有固定大小? 如果它是固定的,你可以做的是有一个int索引值并在同一个循环中依次处理每个ArrayList。 然后,您可以将每个值传输到临时ArrayList,然后在最终的ArrayList中对此进行引用以进行输出。

听起来很混乱? 这是一个粗略的解决方案:

 ArrayList tempList = new ArrayList(); ArrayList outputList = new ArrayList(); for(index=0;index 

这是我的解决方案。感谢@ jpaugh的代码。我希望这对你有帮助。^ _ ^

 public static  List> transpose(List> list) { final int N = list.stream().mapToInt(l -> l.size()).max().orElse(-1); List> 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()); } 

由于get(index)可能会严重损害您的性能,即对于大型链表,我建议使用@polygenelubricants解决方案但使用迭代器方法。

 public static  List> transpose(List> table) { List> ret = new ArrayList>(); final int N = table.stream().mapToInt(l -> l.size()).max().orElse(-1); Iterator[] iters = new Iterator[table.size()]; int i=0; for (List col : table) { iters[i++] = col.iterator(); } for (i = 0; i < N; i++) { List col = new ArrayList(iters.length); for (Iterator it : iters) { col.add(it.hasNext() ? (T) it.next() : null); } ret.add(col); } return ret; }