![](/img/trans.png)
[英]Java Collections - Quickest way to find if there is a Common element between two Sets
[英]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.