2014-02-25 30 views
0
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); 
    } 

...共同元素在Java

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; 

但仍即時通訊無法獲得普通elements..may我KNW笏IM做的錯。

+2

你能證明你的任務類?另外,您還要修改同一個對象三次並將其添加到第一個列表中,這樣兩個列表就沒有共同的元素。 I.e'mainList'包含'[3 Dinnu,3 Dinnu,3 Dinnu]'和'taskList'包含'[1 shiva]' –

+0

@ user3351552當人們試圖幫助你時,反饋是好事。下面的任何解決你的問題(是的,不,也許)。 – zee

+1

可能重複[請告訴我如何編寫和算法在Java中可以返回兩個集合中的常見元素?](http://stackoverflow.com/questions/22016368/please-tell-me-how-to-write - 和 - 算法在java-that-c​​an-return-the-common-ele) – Raedwald

回答

0

一種可能性是使用設置數據結構(在不允許重複的情況下),您可以非常輕鬆地找到兩組之間的聯合。例如Google Guava就提供了這個功能。

1

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

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

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; 

並在任務中實現hasCode()方法(如果使用eclipse IDE意味着按alt + shift + s - >生成哈希碼並自動生成等於()它會自動生成)

+0

@ user3351552你試過這個嗎.. – saravanakumar

+0

是的,但沒有結果..它沒有返回任何東西 – user3351552

+0

我不會依賴hashcode來測試這兩個對象是否具有相同的狀態。 'a等於b => a.hashCode = b.hashCode',但反過來並不總是正確的(你可以與你的散列函數發生衝突) –

0

我看到一件事情肯定是錯誤的,這裏錯了。

首先,當您完成添加到您的第一個列表時,該列表包含對同一個任務實例的三個引用。從本質上講,你有三個任務引用列表中的所有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集合將在您的任務對象上使用「equals()」方法來確定對象相等。如果你沒有,它會檢查對象是否引用同一個對象實例,而不是比較對象的屬性。因此,如果您還沒有Task對象,也可能需要在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 
0

一種方式來做到這一點是通過使用哈希表而不是列表。既然你有字符串和整數hasgtable將是你的場景的理想解決方案,然後你可以使用這樣的東西來找到兩個哈希表的相交值。

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

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

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

這將打印

[琴絃4,弦3]

大部分代碼被設置的值。不要忘記在您的自定義課程中實施.equals(Object o).hashCode()

+0

這是「相當直接」@Jeroen Vannevel ..... @ user3351552做任何這些幫助......或者你太忙張貼在其他地方像http://stackoverflow.com/questions/22016368/please-tell-我怎麼寫和算法在java中,可以返回的普通電子 – zee

+0

no sir ...「最終列表:真正的 []」這是我得到的輸出 – user3351552

+0

這就是因爲你沒有寫我寫的東西。'retainAll()'返回一個'boolean'值並修改集合。您必須先調用'retainAll()',然後添加另一行以打印集合的值。 –

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

下面是一個例子:

import java.util.*; 

public class Task1 { 
    public static void main(String[] args) { 
     List<Task> mainList = new ArrayList<Task>(); 

     Task task0 = new Task(); 
     task0.setId(0); 
     task0.setName("task0"); 

     Task task1 = new Task(); 
     task1.setId(1); 
     task1.setName("task1"); 

     mainList.add(task0); 
     mainList.add(task1); 

     List<Task> subList = new ArrayList<Task>(); 
     Task task2 = new Task(); 
     task2.setId(2); 
     task2.setName("task2"); 

     subList.add(task0); 
     subList.add(task2); 

     List<Task> finalList = getFinalList(mainList, subList); 
     for(Task task : finalList){ 
      System.out.println("Common tasks: id:" + task.getId() + ", name:" + task.getName()); 
     } 
    } 

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

class Task { 
    private Integer id; 
    private String name; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

在輸出端,我們將得到:

Common tasks: id:0, name:task0

+0

nope @alexey ......它沒有返回 – user3351552