我有两个List<Object[]>
个。
第一个元素包含{1, 'a'}, {2, 'd'}
等元素...... Object[]
此处的Object
始终是两个Integer
s(Character
的数组, {1, 12.0}, {2, 14.0}
)。
第二个有Object[]
等。Object
这里是两个Integer
的数组Double
和Integer
)。
Integer
与第二个列表中的e
完全相同。我的意思是,对于第一个列表中的任何列表元素ee
,第二个列表中都有一个元素e[0] == ee[0]
,List<Object[]>
。反之亦然。
我需要从两个List<Object[]>
构建一个List<Object[]>
,以便{1, 'a', 12.0}, {2, 'd', 14.0}
必须包含apache commons
等元素......
我该怎么做?
也许有来自google guava
或criteria.list()
图书馆的即时解决方案?
一个小小的注释:这些列表由hibernate中的{{1}}方法返回。
答案 0 :(得分:3)
这样的事情应该有效
Map<Integer, Character> map1 = new HashMap<Integer, Character>();
for (Object[] o : list1) {
map1.put((Integer)o[0], (Character)o[1]);
}
Map<Integer, Double> map2 = new HashMap<Integer, Double>();
for (Object[] o : list2) {
map2.put((Integer)o[0], (Double)o[1]);
}
List<Object[]> list3 = new ArrayList<Object[]>();
for (int i = 0; i < list1.size(); i++) {
list3.add(new Object[] { i, map1.get(i), map2.get(i) })
}
答案 1 :(得分:2)
在任何解决方案中,我首先会创建第二个列表的地图,并在迭代第一个列表时查看它。
在java 8中,它相当整洁(2行):
final Map<Integer, Double> map = list2.stream().collect(Collectors.groupingBy(a -> a[0], a -> a[1]));
List<Object[]> result = list1.stream()
.map(a -> new Object{a[0], a[1], map.get(a[0])})
.collect(Collectors.toList());
注意:代码未经过测试且未使用IDE(在手机上翻阅),因此可能存在错误。