2015-01-12 98 views
1

我有兩個List<Object[]> s。如何將兩個List <Object[]>對象合併爲一個List <Object[]>

第一個具有像{1, 'a'}, {2, 'd'}等元素......這就是Object[]這裏始終是兩個Object S(IntegerCharacter)陣列。

第二個具有{1, 12.0}, {2, 14.0},等。Object[]這裏是兩個Object的(IntegerDouble)的陣列。

Integer s從第一個列表中絕對地與第二個列表中的Integer s相同。我的意思是,對於第一個列表中的任何列表元素e,第二個列表中有一個元素ee,因此e[0] == ee[0]。反之亦然。

我需要構建由兩個List<Object[]>一個如此List<Object[]>,該List<Object[]>必須包含像{1, 'a', 12.0}, {2, 'd', 14.0}元素,等等

我怎麼能這樣做?

也許有從apache commonsgoogle guava圖書館的即時解決方案?

一個小記錄:這個列表在休眠狀態下由criteria.list()方法返回。

+0

可以使用java 8嗎? – Bohemian

+0

這似乎是一個足夠簡單的問題,可以使用「經典方法」快速編寫代碼,我相信從那裏可以更輕鬆地找到改進代碼的方法。 – reto

+2

您應該使用這種情況來完全避免對象數組,並使用模型類來代替。這個模型類將保存3個類型爲'int','char'和'double'的實例變量。你的數組就像一個「驚喜包」,因爲它可以包含任何東西,應該避免。 – Tom

回答

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) }) 
} 
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(翻閱手機上),所以有可能是錯誤的。

相關問題