比较两个对象列表并返回一个包含两个公共对象的列表

时间:2012-07-12 06:16:33

标签: java

我有两个清单 -

ArrayList<MyObject> list1 -> [obj1, obj2, obj3, obj4, obj5, obj6]

ArrayList<MyObject>  list2 -> [obj1, obj6, obj7, obj8]

java api中是否存在任何实用方法,只能列出两个常见记录?

预期清单 - &gt; [obj1, obj6]

MyObject看起来像这样 -

class MyObject {
  public Integer number;
  public String name;
  public Integer parent;
  public String parentName;
}

我只需要使用numbername进行比较。


我知道使用retainAllremoveAll获取所需列表的方法。但问题是,我无法覆盖equals MyObject方法,因为它用于某种不同目的。并且retainAllremoveAll方法似乎不接受Comparator对象。

我知道另一种解决方案是遍历列表并找到常见的列表。我正在寻找是否已经有一些方法可以做到这一点。

感谢。

2 个答案:

答案 0 :(得分:3)

我不知道有什么比你已经建议的更干净。

但是,如果你需要相等但不能使用equals(我不会问;)你可以合并列表并对它们进行排序,然后手动将每个元素与下一个元素进行比较,仅保留重复的。

答案 1 :(得分:1)

如果你想从两个列表中获得相同的值,我给你一个字符串示例:

/**
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
    // create a script engine manager

    List<String> list_1 = new ArrayList<String>();
    list_1.add("a");
    list_1.add("b");
    List<String> list_2 = new ArrayList<String>();
    list_2.add("a");
    list_2.add("b");
    list_2.add("c");
    System.out.println(getSameVaue(list_2,list_1));
}

public static List<String> getSameVaue(List<String> list1,
        List<String> list2) {
    List<String> result = new ArrayList<String>();
    if (list1.size() > list2.size()) {
        for (String s : list1) {
            if (list2.contains(s)) {
                result.add(s);
            }
        }
    } else {
        for (String s : list2) {
            if (list1.contains(s)) {
                result.add(s);
            }
        }
    }
    return result;
}

但是如果你想使用你的对象,请不要忘记实现等于方法。