2012-07-12 84 views
-1

共通对象名单我有两个表 -比较对象的两个列表,并返回其具有两个

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

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

有任何实用工具方法的Java API已经存在,可以给的唯一共同的记录列表二?

预期列表 - > [obj1, obj6]

myObject的是这样的 -

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

我只需要使用numbername做比较。


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

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

谢谢。

回答

3

我不知道比你已经建议的更清洁的方式。但是,如果您需要平等但不能使用equals(我不打算问);您可以合并列表并对它们进行排序,然后手动比较每个元素到下一个元素,只保留重复的元素。

+0

它令人失望,因为'java.util.List'方法没有使用'Comparator'的重载方法。无论如何,我创建了一个独立的实用程序方法,它需要一个比较器并在其中添加所有脏代码,所以也许我可以在需要时重复使用相同的代码..... btw感谢您的建议!它符合要求。 – Kshitij 2012-07-12 09:02:55

+0

@Kshitij嗯我不知道你的确切要求是什么,我相信你有很好的理由,但是你是那种违反流程的人,通过使用'equals'方法来处理那些不是' t等于;)要小心,不要使用任何也依赖于equals的东西,这可能很难追踪错误! – Miquel 2012-07-12 09:07:45

+0

实际上,在我的情况下,'equals'方法也用于比较两个实体,正如我们通常所做的那样,上面的场景是一个特殊情况,我只需要比较几个字段。我早就应该指出,我上面展示的MyObject只是一个示例,而不是实际的对象,实际的对象更大,而且具有完全不同的领域。 – Kshitij 2012-07-13 04:24:01

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; 
} 

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