2012-05-04 67 views
0

我有一個arrayList的arrayList。每個內部數組列表包含一些格式爲(name.version)的對象。從列表中刪除重複項並保留列表

{ {a.1,b.2,c.3} , {a.2,d.1,e.1} , {b.3,f.1,z.1}....} 

例如A.1意味着名稱=和版本爲1

所以我想消除這個ArrayList中列出的副本。對我來說,兩個對象是重複的,當他們具有相同的名稱

所以基本上我的輸出應該是

{ { a.1,b.2,c.3},{d.1,e.1} ,{f.1 ,z.1} } 

注意,我想在完全相同的輸出形式(也就是,我不希望有一個單一的列表中沒有重複項)

有人可以爲我提供一個最佳解決方案嗎?

我可以遍歷每個內部列表並將內容放置在哈希集中。但有兩個問題,我不能回覆在列表的列表中的 形式的答案。另一個問題是,當我需要覆蓋該對象的等於,但我不知道如果那將 打破其他代碼。這些對象是有意義的平等,如果他們的名字是相同的(只有在這種情況下,我不知道會 覆蓋整個光譜)

感謝

+0

它看起來像功課,所以請對其進行標記或編輯的帖子說這是不是功課 –

+0

它不是一門功課problem.Its我們有 – Barry

+0

如果說你一個真正的問題在a1之前來過a2是a2的預期行動嗎? – Krrose27

回答

2
List<List<Pair>> inputs; // in whatever format you have them 
List<List<Pair>> uniqued = new ArrayList<>(); // output to here 
Set<String> seen = new HashSet<String>(); 
for (List<Pair> list : inputs) { 
    List<Pair> output = new ArrayList<>(); 
    for (Pair p : list) 
    if (seen.add(p.getName())) 
     output.add(p); 
    uniqued.add(output); 
} 
1

創建集。迭代列表項目列表。看看這個物品是否在Set中。如果已經存在,請忽略它。如果不是,請將其添加到「設置」和列表的列表中。

你的方法將返回一個新的列表清單,而不是修改舊的清單。迭代時修改列表是一種痛苦。

3

我用Iterator.remove()來修改集合,當你在其中移動時。

// build your example input as ArrayList<ArrayList<String>> 
String[][] tmp = { { "a.1", "b.2", "c.3" }, { "a.2", "d.1", "e.1" }, 
     { "b.3", "f.1", "z.1" } }; 
List<List<String>> test = new ArrayList<List<String>>(); 
for (String[] array : tmp) { 
    test.add(new ArrayList<String>(Arrays.asList(array))); 
} 

// keep track of elements we've already seen 
Set<String> nameCache = new HashSet<String>(); 

// iterate and remove if seen before 
for (List<String> list : test) { 
    for (Iterator<String> it = list.iterator(); it.hasNext();) { 
     String element = it.next(); 
     String name = element.split("\\.")[0]; 
     if (nameCache.contains(name)) { 
      it.remove(); 
     } else { 
      nameCache.add(name); 
     } 
    } 
} 
System.out.println(test); 

輸出

[[a.1, b.2, c.3], [d.1, e.1], [f.1, z.1]]