2012-12-05 67 views
1

我有對象的列表格式如下:如何創建重複列表項目的列表?

class myObj { 

    private String identifier; 

    public myObj(String identifier){ 
     this.identifier = identifier; 
    } 

} 

List<myObj> allobjects = new ArrayList<myObj>(); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("1234")); 
allobjects.add(new myObj("12345")); 
allobjects.add(new myObj("12")); 
allobjects.add(new myObj("12")); 

什麼是提取重複的對象爲單獨列出的一個優雅的方法是什麼? 所以在上面的例子中返回一個包含兩個列表的新列表。所述第一列表 包含:

new myObj("123"); 
new myObj("123"); 
new myObj("123"); 
new myObj("123"); 

第二列表包含:

new myObj("12"); 
new myObj("12"); 

一種可能的解決方案是創建一個新對象:

List<List<myObj>> newList = new ArrayList<List<myObj>> 

,然後在列表中的每個元素'allobjects'遍歷每個元素,並且對於包含多個元素的每個元素將其添加到列表中。然後在 當前元素的迭代結束時將新創建的列表添加到'newList'

這是可以接受的還是有其他解決方案嗎?

+0

請問一個解決方案,獨特的元素也得到了自己的名單會好嗎? – durron597

+0

@ durron597我可以忽略列表項目的大小== 1 –

+1

使用自定義的「Comparator 」(或創建新列表並對其進行排序)對您的列表進行排序。瀏覽排序的列表並檢測相鄰的重複項。這樣你的算法只能是* O(nlogn)*,而你提出的解決方案是* O(n²)*。 – brimborium

回答

2

添加equals和hashCode方法的MyObj中類,這樣就可以將它們作爲地圖鍵:

class myObj { 

    private String identifier; 

    public myObj(String identifier){ 
     this.identifier = identifier; 
    } 

    public int hashCode(){ 
     return identifier.hashCode(); 
    } 

    public boolean equals(Object o){ 
     return identifier.equals(((myObj)o).identifier); 
    } 
} 

然後聲明一個Map:

Map<myObj, List<myObj>> map = new HashMap<myObj, List<MyObj>>() 

,並通過迭代原始列表。使用myObjs作爲映射鍵,每次檢索與myObj相對應的列表。如果你遇到的第一次一定MyObj中,不要忘了創建列表:

for(myObj obj : allobjects){ 
    List<myObj> list = map.get(obj); 
    if(list == null){ 
     list = new ArrayList<myObj>(); 
     map.put(obj, list); 
    } 
    list.add(obj); 
} 
1

執行等於所需要的,然後你可以使用包含和迭代通過檢查其他集合。

以下是使用jdk8s的lambda表達式的方法。

TransformService transformService = (inputs1, inputs2) -> { 
      Collection<String> results = new ArrayList<>(); 
      for (String str : inputs1) { 
       if (inputs2.contains(str)) { 
        results.add(str); 
       } 
      } 
      return results; 
     }; 
     Collection<String> inputs1 = new ArrayList<String>(2) {{ 
      add("lemon"); 
      add("cheese"); 
      add("orange"); 
     }}; 
     Collection<String> inputs2 = new 
       ArrayList<String>(2) {{ 
        add("apple"); 
        add("random"); 
        add("cheese"); 
       }}; 
     Collection<String> results = transformService.transform(inputs1, inputs2); 
     for (String result : results) { 
      System.out.println(result); 
     } 
    } 

    public interface TransformService { 
     Collection<String> transform(Collection<String> inputs1, Collection<String> inputs2); 
    } 
+0

我應該提到這需要與java6一起工作,所以沒有lambda表達式:( –

+0

@ user470184以及答案仍然存在,只是通過列表循環,如果包含,添加到新列表.... – NimChimpsky