java 左连接吗,两个不同Java对象的“左连接”

您正在尝试做一些Java并不是真正意义上的事情.

如果能够这样做,最好向Object1添加一个属性,它将是包含与此相关的对象的Object2列表.

如果你不能,我们仍然可以选择天真地做,否则你可以尝试这样的事情:

HashSet hs = new HashSet(list2.size());

for(Object2 o : list2) {

hs.add(o.object1id);

}

//hs contains all the ids of list2

List result = new ArrayList(); //Or another class implementing List

for(Object1 o : list1) {

if(hs.contains(o.id))

result.add(o);

}

因为你必须在HashSet中存储所有id,所以并不漂亮,但由于在HashSet中添加和访问元素是O(1)(理论上),算法是O(n m)

如果您的Object3类是使用Object1和Object2构造的,请使用HasMap而不是HashSet,其中键是id,值是object2.代码中的最后一个for循环将变为:

Object2 o2 = hs.get(o.id);

if(o2 != null)

result.add(new Object3(o, o2);

继ÓscarLópez发表评论:

如果您的objectid1不是唯一的,您必须按如下方式调整代码:

HashMap> hm = new HashMap>();

for(Object2 o : list2) {

List l = hm.get(o.objectid1);

if(l != null) {

l.add(o);

} else {

List l = new ArrayList();

l.add(o);

hm.put(o.objectid1, l);

}

//hm is map, where each entry contains the list of Object2 associated with objectid1

List result = new ArrayList();

for(Object1 o : list1) {

List l = hm.get(o.id);

//l contains all Object2 with object1id = o.id

for(Object2 o2 : l)

result.add(new Object3(o, o2));

}

仍然在O(n m),但具有更大的常数……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想在Java中对两个集合进行左连接,可以使用Java 8中的Stream API和Lambda表达式来实现。假设您有两个对象列表,每个对象都有一个属性用于连接: ```java List<Left> leftList = new ArrayList<>(); List<Right> rightList = new ArrayList<>(); class Left { private int id; private String value; public Left(int id, String value) { this.id = id; this.value = value; } public int getId() { return id; } public String getValue() { return value; } } class Right { private int id; private String value; public Right(int id, String value) { this.id = id; this.value = value; } public int getId() { return id; } public String getValue() { return value; } } ``` 现在,您可以使用以下代码来实现左连接: ```java List<String> result = leftList.stream() .map(left -> { Optional<Right> optionalRight = rightList.stream() .filter(right -> right.getId() == left.getId()) .findFirst(); if (optionalRight.isPresent()) { return left.getValue() + optionalRight.get().getValue(); } else { return left.getValue() + "null"; } }) .collect(Collectors.toList()); ``` 在这个代码中,我们首先使用`stream()`方法将左侧列表转换为一个Stream对象。然后,我们使用`map()`方法将每个左侧对象映射到一个新的字符串。在这个`map()`方法中,我们使用另一个Stream对象来查找右侧对象,它的id属性与当前左侧对象的id属性相同。如果找到了匹配的右侧对象,我们将左侧对象的值和右侧对象的值连接起来。否则,我们将左侧对象的值连接到一个字符串"null"。最后,我们使用`collect()`方法将所有的字符串收集到一个列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值