Arraylist 上的谓词

问题描述 投票:0回答:2

我有两个数组列表,如下所示:

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
}

如何用谓词来实现这一点?有人可以帮忙吗?

实际场景就像我有一个来自设备联系人书籍的联系人数组列表,其中包含名称、号码、电子邮件ID,当我将这些联系人与我的应用程序服务r同步时,我得到号码、用户ID和图像网址返回。现在我需要将数字与这两个数组映射,并需要生成公共数组,其中包含所有详细信息,例如number,name,emailId,userId,Image Url

提前致谢。

java android arraylist predicate
2个回答
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.

我在 Java API 中找不到类似的东西。


0
投票

对于 PHP - 现场演示

供您参考:-

array_merge()
用于合并两个数组 如果设置条件
$item_one['number'] == $item_two['number']

$array_one = array(
    array('name' => 'name1', 'number' => 1234),
    array('name' => 'name2', 'number' => 4567),
    array('name' => 'name3', 'number' => 6789)
);

$array_two = array(
    array('number' => 1234, 'userId' => 'u1'),
    array('number' => 4567, 'userId' => 'u2'),
    array('number' => 6789, 'userId' => 'u3')
);

$array_three = array(); 

foreach ($array_one as $item_one) {
    foreach ($array_two as $item_two) {
        if ($item_one['number'] == $item_two['number']) {
            $merged_both = array_merge($item_one, $item_two);
            $array_three[] = $merged_both;
        }
    }
}

print_r($array_three);

您可以在在线java编译器中运行以下代码 - 运行在线编译器

List
Map
表示数组,它比较“数字”值以将项目合并到新列表中,为了简单起见,
arraythree
数组和
Map.of
方法用于创建不可变映射。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MergeArrays {
    public static void main(String[] args) {
        List<Map<String, Object>> arrayone = new ArrayList<>();
        arrayone.add(Map.of("name", "name1", "number", 1234));
        arrayone.add(Map.of("name", "name2", "number", 4567));
        arrayone.add(Map.of("name", "name3", "number", 6789));

        List<Map<String, Object>> arraytwo = new ArrayList<>();
        arraytwo.add(Map.of("number", 1234, "userId", "u1"));
        arraytwo.add(Map.of("number", 4567, "userId", "u2"));
        arraytwo.add(Map.of("number", 6789, "userId", "u3"));

        List<Map<String, Object>> arraythree = new ArrayList<>();

        for (Map<String, Object> itemA : arrayone) {
            for (Map<String, Object> itemB : arraytwo) {
                if (itemA.get("number").equals(itemB.get("number"))) {
                    Map<String, Object> mergedItem = new HashMap<>(itemA);
                    mergedItem.putAll(itemB);
                    arraythree.add(mergedItem);
                }
            }
        }

        System.out.println(arraythree);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.