2016-05-12 38 views
0

嗨我有兩個數組列表列表l1和列表l2,名稱,年齡,性別,uniqID,標記是列表中的數據。我想加入l1和l2而沒有duplicates.uniqID對每個學生都是唯一的。我一直在循環所有的元素,並比較每一個元素。但是我的清單將有大約20k項目,因此循環花費了太多時間。我試過 all the answers from this post沒有爲我工作。有什麼建議麼。?合併模型元素ArrayList沒有重複

+0

你覆蓋'equals'在你的「人」類?刪除像這篇文章http://stackoverflow.com/a/14361428/966852中建議的重複項應該在執行「equals」時工作。 – samjaf

+0

@Shanu:你可以使用'HashSet'或任何實現'set'接口的集合。 – AndiGeeky

回答

1

簡單的例子:

public class Person{ 
    int id; 
    String name; 
    //fields, getter, setter, constructor omited.... 

    @Override 
    public boolean equals(Object o){ 
     if (!(o instanceof Person)){ 
      //implicit null check 
      return false; 
     } 
     return this.id==((Person)o).id; 
    } 

    @Override 
    public int hashCode(){ 
     return this.id; 
    } 
} 

Person確實現在實現equals和hashCode。 equals由java用來決定對象是否是另一個對象的重複。 hashCode本身不是必需的,但建議一起覆蓋hashCodeequals

如果這兩種方法來實現,你可以簡單地使用在Java中積累的方法和數據結構:

隨着名單:

List<Person> listA = new ArrayList<>(); 
List<Person> listB = new ArrayList<>(); 
// filling the lists omitted 
List<Person> mergedList=new ArrayList<>(); 
mergedList.addAll(listA); 
mergedList.removeAll(listB); 
mergedList.addAll(listB); 

或用套:

List<Person> listA = new ArrayList<>(); 
List<Person> listB = new ArrayList<>(); 
// filling the lists omitted 
Set<Person> mergedSet=new HashSet<>(); 
mergedSet.addAll(listA); 
mergedSet.addAll(listB); 
+0

我會馬上試試。 – Sreyas

+0

儘管該列表正在消除所有重複項,但需要1分鐘左右的時間。 – Sreyas

+0

您使用了哪個示例?使用'Set'的解決方案應該比使用'List'的解決方案執行得更好。如果合併後仍然需要列表的順序,則可以使用「LinkedHashSet」。 – samjaf

0

你可以結合這兩個arraylist並將其傳遞給HashSet對象 由於Set不包含可以執行的重複項

ArrayList<String> a=new ArrayList<String>(); 
ArrayList<String> b=new ArrayList<String>(); 

b.addAll(a); 

如果您想保留元素的順序使用LinkedHashSet

LinkedHashSet<String> result=new LinkedHashSet<String>(b); 
+0

將這兩個列表結合起來並將它們添加到'Set'中會比我們需要更多的工作。你可以調用'addAll'這兩個列表到(空)Set。此外,問題是自定義類中沒有「equals」和「hashCode」,這會阻止「Set」正常工作。 – samjaf