Java Merge 2自定义类结果

时间:2014-09-15 10:09:15

标签: java arraylist

我有2个自定义Java类;

private MyCustomClass1 obj1;
private MyCustomClass2 obj2;

每个属性都有多个属性,如下所示;

MyCustomClass1 {
attr1,
attr2,
commonattrId,
attr3
}


MyCustomClass2 {
attr4,
attr5,
commonattrId,
attr6
}

正如你所看到的,每个都有一个共同的属性(commonattrId),只需添加一个长的

还有一个复合类定义如下;

MyCompositeClass {
    MyCustomClass1 obj1;
    MyCustomClass2 obj2;
}

现在我的一个查询执行返回到列表下面;

  

列出myList1

并且还有另一个查询执行,它将我返回到列表下方;

  

列出myList2

我的问题是,如果我有一个共同的话,我可以合并上面的两个列表吗?

2 个答案:

答案 0 :(得分:0)

稍长但想法是在MyClass1MyClass2中覆盖等于:

public static void main(String[] args) throws IOException {

    List<MyClass1> myClass1s = new ArrayList<MyClass1>();

    myClass1s.add(new MyClass1(1, 1));
    myClass1s.add(new MyClass1(2, 2));

    List<MyClass2> myClass2s = new ArrayList<MyClass2>();

    myClass2s.add(new MyClass2(3, 1));
    myClass2s.add(new MyClass2(4, 2));

    List<MyComposite> allMyClasses = new ArrayList<MyComposite>();
    for(MyClass1 m : myClass1s) { // note: you should take the shorte of the two lists
        int index = myClass2s.indexOf(m);
        if(index != -1) {
            allMyClasses.add(new MyComposite(m, myClass2s.get(index)));
        }
    }
    System.out.println(allMyClasses);
}

static class MyClass1 {
    int attr1;
    long commonAttrId;

    public MyClass1(int attr, long commonAttr) {
        this.attr1 = attr;
        this.commonAttrId = commonAttr;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 83 * hash + (int) (this.commonAttrId ^ (this.commonAttrId >>> 32));
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if(obj instanceof MyClass2) {
            return this.commonAttrId == ((MyClass2)obj).commonAttrId;
        }
        if(obj instanceof MyClass1) {
            return this.commonAttrId == ((MyClass1)obj).commonAttrId;
        }
        return false;
    }

    @Override
    public String toString() {
        return "attr1=" + attr1 + ", commonAttrId=" + commonAttrId;
    }
}

static class MyClass2 {
    int attr2;
    long commonAttrId;

    public MyClass2(int attr, long commonAttr) {
        this.attr2 = attr;
        this.commonAttrId = commonAttr;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 83 * hash + (int) (this.commonAttrId ^ (this.commonAttrId >>> 32));
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if(obj instanceof MyClass1) {
            return this.commonAttrId == ((MyClass1)obj).commonAttrId;
        }
        if(obj instanceof MyClass2) {
            return this.commonAttrId == ((MyClass2)obj).commonAttrId;
        }
        return false;
    }

    @Override
    public String toString() {
        return "attr2=" + attr2 + ", commonAttrId=" + commonAttrId;
    }
}

static class MyComposite {
    MyClass1 myClass1;
    MyClass2 myClass2;

    public MyComposite(MyClass1 a, MyClass2 b) {
        myClass1 = a;
        myClass2 = b;
    }

    @Override
    public String toString() {
        return "myClass1=" + myClass1 + ", myClass2=" + myClass2;
    }
}

我不知道您问题的所有参数,但可能有更好的方法来做到这一点。例如:让MyClass1MyClass2都从公共类继承(即MyBaseClass)并创建一个集合,而不是复合类MyCompositeClass。 或者代替List s,您可以设置并创建集合交集。

答案 1 :(得分:0)

您可以为其中一个列表创建从id到对象的映射,然后使用地图中的数据迭代另一个以创建新List。

List<MyCompositeClass> combine(List<MyCustomClass1> myList1, List<MyCustomClass2> myList2) {
   // create map
   Map<Long, MyCustomClass1> idToObj = new HashMap<>();
   for (MyCustomClass1 o : myList1) {
       idToObj.put(o.commonattrId, o);
   }
   // construct result list
   List<MyCompositeClass> result = new ArrayList<>();
   for (MyCustomClass2 o : myList2) {
       MyCustomClass1 o1 = map.get(o.commonattrId);
       if (o1 != null) {
           MyCompositeClass combined = new MyCompositeClass();
           combined.obj1 = o1;
           combined.obj2 = o;
           result.add(combined);
       }
   }
   return result;
}

这只会添加两个列表中所有可能的对象组合,如果commonattrId值在每个列表中是成对不同的,但由于字段名称后缀为“Id”,我做了一个有根据的猜测......