从列表列表中删除重复项并保留列表

时间:2012-05-04 23:52:41

标签: java arraylist

我有一个arrayList的arrayList。每个内部arraylist包含一些格式为(name.version)的对象。

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

例如a.1表示name = a,version为1。

所以我想在列表的这个列表中消除重复。对我来说,当两个对象具有相同的名称时,它们是重复的

所以基本上我的输出应该是

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

请注意,我想要输出完全相同的形式(也就是说,我不想要一个没有重复的列表)

有人可以为我提供最佳解决方案吗?

我可以遍历每个内部列表并将内容放在hashset中。但那里有两个问题,我无法回答这个问题 列表列表的形式。另一个问题是,当我需要覆盖该对象的equals时,但我不确定是否会 打破其他代码。如果它们的名称相同,则这些对象有意义相同(仅在这种情况下。我不确定会这样 覆盖整个频谱)

由于

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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);
}

答案 2 :(得分:1)

创建一个集合。迭代列表项的列表。查看该项目是否在Set中。如果已经存在,请忽略它。如果不是,请将其添加到Set和列表列表中。

您的方法将返回一个新的列表列表,而不是修改旧的列表。迭代修改列表是一件痛苦的事。