2016-07-05 127 views
3

我有兩個數組列表按照以下結構:謂詞的ArrayList

Arraylist A :: 

{name : name1, 
number : 1234 
}, 
{name : name2, 
number : 4567 
}, 
{name : name3, 
number : 6789 
} 

Arraylist B :: 

{number : 1234, 
userId : u1 
}, 
{number : 4567 
userId : u2 
}, 
{number : 6789 
userId : u3 
} 

現在我需要在接下來的方式合併兩個數組:

Arraylist C :: 

{name : name1, 
number : 1234, 
userId : u1 
}, 
{name : name2, 
number : 4567, 
userId : u2 
}, 
{name : name3, 
number : 6789, 
userId : u3 
} 

如何使用謂詞實現這一目標?任何人都可以請幫忙。?

實際情況是像我有從設備接觸本書包含名稱,數量,EMAILID當我同步我的應用這些聯繫人服務裏得到號碼,帳戶及圖片接觸的數組列表作爲回報,網址爲。現在我需要用這兩個數組映射數字,並需要生成常用數組其中包含所有的詳細信息,如號碼,名稱,emailId,userId,圖像Url

在此先感謝。

+0

我認爲使用字典是更好的方法來處理這種情況。 – pooyan

+1

元素的類型是什麼?他們只是「Map」嗎? –

+0

@JornVernee - 它們是實體(模型)類型。這裏只是一個簡短的結構演示,因爲我不能在這裏打印實體類 – Jigar

回答

0

我昨天把這個實用函數做成了zip兩個列表在一起。

你傳遞兩個列表,並從每個列表使用的元素,並創建一個新的元素添加到結果列表中的BiFunction

public static <T, S, R> List<R> zip(List<? extends T> l1, List<? extends S> l2, 
    BiFunction<? super T, ? super S, R> zipper) { 

    int size = Math.min(l1.size(), l2.size()); 
    List<R> result = new ArrayList<>(); 

    for(int i = 0; i < size; i++) 
     result.add(zipper.apply(l1.get(i), l2.get(i))); 

    return result; 
} 

使用像這樣:

class A {...} 
class B {...} 

class C { // Combination of A and B 
    ... 
    public C(name, number, emailId, userId, imageUrl) {...} // Types ommitted 

    // public C(A a, B b) {...} // <-- optionally this, you could just pass C::new 
    ... 
} 
List<A> list1 = ...; 
List<B> list2 = ...; 

List<C> list3 = zip(list1, list2, 
    (a, b) -> new C(a.getName(), a.getNumber(), a.getEmailID(), 
     b.getUserId(), b.getImageUrl())); // Use appropriate getters. 

我在t中找不到像這樣的東西他是Java API。

+0

BiFunction類需要API等級24或更高。所以不能使用它。這裏有一個相同的參考https://developer.android.com/reference/java/util/function/BiFunction.html – Jigar

+0

@Jigar你可以很容易地實現它:'''interface BiFunction {R apply(T, S); }''(它仍然缺少'''和Then''',但這裏不需要) –

+0

好吧我會嘗試這種方法 – Jigar