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

Java 从列表列表中删除重复项并保留列表,java,arraylist,Java,Arraylist,我有一个数组列表。每个内部arraylist都包含一些格式为(name.version)的对象 例如,a.1表示name=a,版本为1 所以我想消除列表数组列表中的重复项。对我来说,当两个对象具有相同的名称时,它们是重复的 所以本质上我的输出应该是 { { a.1,b.2,c.3},{d.1,e.1} ,{f.1 ,z.1} } 请注意,我希望输出的格式完全相同(也就是说,我不想要一个没有重复项的列表) 有人能为我提供一个最佳的解决方案吗 我可以循环遍历每个内部列表,并将内容放在hashset

我有一个数组列表。每个内部arraylist都包含一些格式为(name.version)的对象

例如,a.1表示name=a,版本为1

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

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

{ { a.1,b.2,c.3},{d.1,e.1} ,{f.1 ,z.1} }
请注意,我希望输出的格式完全相同(也就是说,我不想要一个没有重复项的列表)

有人能为我提供一个最佳的解决方案吗

我可以循环遍历每个内部列表,并将内容放在hashset中。但有两个问题,我无法从中得到答案 列表列表的形式。另一个问题是,当我需要覆盖该对象的等于时,但我不确定这是否会发生 破坏其他代码。如果这些对象的名称相同(仅在本例中,我不确定这是否会发生),那么它们就有意义地相等 覆盖整个光谱)

谢谢

列出输入;//不管你有什么格式
List uniqued=new ArrayList();//输出到此处
Set seen=新的HashSet();
用于(列表:输入){
列表输出=新的ArrayList();
用于(p对:列表)
if(seen.add(p.getName()))
增加(p);
唯一添加(输出);
}
列出输入;//不管你有什么格式
List uniqued=new ArrayList();//输出到此处
Set seen=新的HashSet();
用于(列表:输入){
列表输出=新的ArrayList();
用于(p对:列表)
if(seen.add(p.getName()))
增加(p);
唯一添加(输出);
}

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


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

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

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

我使用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);
我使用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);

它看起来像家庭作业,所以请贴上标签或编辑帖子,说这不是家庭作业,不是家庭作业问题。如果说你在a1之前进入a2,这是一个真正的问题。a2保留的目的是什么?是的,先到的是keptit看起来像家庭作业,因此,请贴上标签或编辑帖子,说明这不是家庭作业,也不是家庭作业问题。如果说你在a1之前通过a2,那么这是一个真正的问题。a2保留的目的是什么?是的,先到的保留
// 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]]