2016-07-05 128 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