java中两个集合之间的公共元素

时间:2014-02-25 15:04:30

标签: java

  public class Task1 {

     public static void main(String[] args) {

        List<Task> mainList = new ArrayList<>();
        Task e = new Task();
        e.setId(1);
        e.setName("shiva");
        mainList.add(e);

        e.setId(2);
        e.setName("Jyothi");
        mainList.add(e);

        e.setId(3);
        e.setName("Dinnu");
        mainList.add(e);

        //System.out.println(mainList);

        List<Task> subList = new ArrayList<>();

        Task e1 = new Task();
        e1.setId(1);
        e1.setName("shiva");
        subList.add(e1);


        List<Task> finalList = getFinalList(mainList, subList);
    }

...

    private static List<Task> getFinalList(List<Task> mainList, List<Task> subList) {
        List<Task> finalList = new ArrayList<>();

        System.out.println("final List: "+mainList.retainAll(subList));

        for(Task o : mainList){

            for(Task o1 : subList){

                if (o.equals(o1)){

                                  finalList.add(o);
                }
            }
        }

        System.out.println(finalList);
        return finalList;

但是我仍然无法得到共同的元素。可能我知道你是在犯错。

7 个答案:

答案 0 :(得分:2)

这是一个相当简单的解决方案:

public static void main(String[] args) {
    List<String> list1 = new ArrayList<String>() {
        {
            add("string 1");
            add("string 2");
            add("string 3");
            add("string 4");
        }
    };
    List<String> list2 = new ArrayList<String>() {
        {
            add("string 4");
            add("string 5");
            add("string 3");
            add("string 6");
            add("string 3");
        }
    };

    Set<String> hash1 = new HashSet<>(list1);
    Set<String> hash2 = new HashSet<>(list2);

    hash1.retainAll(hash2);

    System.out.println(hash1);
}

打印

  

[string 4,string 3]

大多数代码都是设置值。不要忘记在自定义类中实现.equals(Object o).hashCode()

答案 1 :(得分:1)

您需要为Task类编写适当的equals()方法。您创建了两个不同的Task对象,默认的equals()实现在这种情况下不起作用。编写一个自定义的equals(),适当地比较id和名称!

编辑:此外,看起来您实际上并没有为第一个列表创建三个任务。您创建一个新任务,然后更改其值。如果在完成设置后打印出mainList的大小,它可能在三次内有相同的Task对象。

答案 2 :(得分:0)

一种可能性是使用Set数据结构(不允许重复),您可以非常轻松地找到两组之间的并集。例如Google Guava提供了这个。

答案 3 :(得分:0)

每次mainList只有一个对象

时,您修改了相同的实例

像这样重新创建

    List<Task> mainList = new ArrayList<Task>();
    Task e = new Task();
    e.setId(1);
    e.setName("shiva");
    mainList.add(e);

    Task e1 = new Task();
    e1.setId(2);
    e1.setName("Jyothi");
    mainList.add(e1);

    Task e12 = new Task();
    e12.setId(3);
    e12.setName("Dinnu");
    mainList.add(e12);

    //System.out.println(mainList);

    List<Task> subList = new ArrayList<Task>();

    Task e13 = new Task();
    e13.setId(1);
    e13.setName("shiva");
    subList.add(e13);

并删除此行...

      System.out.println("final List: "+mainList.retainAll(subList));

使用

      for(Task o : mainList){

        for(Task o1 : subList){

            if( ( o.getId() == o1.getId() ) && o.getName().equals(o1.getName()) ){
                                finalList.add(o);
      }     
        }
    }

    System.out.println(finalList);
    return finalList;

并在Task中实现hasCode()方法(如果你使用eclipse IDE意味着按alt + shift + s - &gt;生成哈希码和equals()它会自动生成)

答案 4 :(得分:0)

我看到一件事肯定是错的,这里有一件事可能有问题。

首先,当您完成添加到第一个列表后,该列表包含对同一个Task实例的三个引用。基本上,列表中有三个任务引用,它们都具有id = 3和name =“dinnu”。我猜你可能打算这样做:

List<Task> mainList = new ArrayList<>();
Task e = new Task();
e.setId(1);
e.setName("shiva");
mainList.add(e);

e = new Task(); //Make a new instance
e.setId(2);
e.setName("Jyothi");
mainList.add(e);

e = new Task(); //Make a new instance
e.setId(3);
e.setName("Dinnu");
mainList.add(e);

基本上,由于您忘记创建新实例,因此您只是更改同一对象上的值而不是创建新对象。

第二个潜在的问题是Java Collections将使用Task对象上的“equals()”方法来确定对象相等性。如果你没有,它只会检查对象是否引用相同的对象实例,而不是比较对象的属性。因此,您可能需要在Task对象上实现equals()方法,如果您还没有它。

如果修复了这些内容,那么调用mainList.retainAll(subList)将删除mainList中subList中不存在的所有元素。 (finalList不是必需的 - 该调用只会编辑mainList)

如果您想保留mainList而不是编辑它,那么请改为:

List<Task> finalList = new ArrayList<>(mainList); //Copy main into finalList
finalList.retainAll(subList); //remove elements that are not present in subList

答案 5 :(得分:0)

一种方法是使用哈希表而不是列表。因为你有String和整数hasgtable将是你的场景的理想解决方案,然后你可以使用这样的东西来找到两个哈希表中的交叉值。

Hashtable<String, Integer> inersect = new Hashtable<String, Integer>(hashtable1);
inersect.keySet().retainAll(hashtable2.keySet());
System.out.println(inersect);

答案 6 :(得分:0)

等于自定义对象的方法任务需要通过使Task类实现Comparable Class来实现。

class Task implements Comparable<Task>{

@Override
public int compareTo(Task o) {
    return (o.getId()==this.getId() && o.getName().equals(this.getName());
}
//other class functions
}