簡體   English   中英

java中兩個集合之間的公共元素

[英]common elements between two collections in 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;

但是我仍然無法得到共同的元素。我可以告訴你我犯錯了。

這是一個相當簡單的解決方案:

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()

您需要為Task類編寫適當的equals()方法。 您創建了兩個不同的Task對象,默認的equals()實現在這種情況下不起作用。 編寫一個自定義的equals(),適當地比較id和名稱!

編輯:此外,看起來您實際上並沒有為第一個列表創建三個任務。 您創建一個新任務,然后更改其值。 如果在完成設置后打印出mainList的大小,它可能在三次內部具有相同的Task對象。

一種可能性是使用Set數據結構(不允許重復),你可以很容易地找到兩組之間的聯合。 例如Google Guava提供了這一點。

每次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 - >生成哈希碼和equals()它會自動生成)

我看到一件事肯定是錯的,這里有一件事可能是錯的。

首先,當您完成添加到第一個列表后,該列表包含對同一個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 Object上使用“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

一種方法是使用哈希表而不是列表。 因為你有String和整數hasgtable將是你的場景的理想解決方案,然后你可以使用這樣的東西來找到兩個哈希表中的交叉值。

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

equals自定義對象的方法任務需要通過使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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM