我有一个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时,但我不确定是否会 打破其他代码。如果它们的名称相同,则这些对象有意义相同(仅在这种情况下。我不确定会这样 覆盖整个频谱)
由于
答案 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和列表列表中。
您的方法将返回一个新的列表列表,而不是修改旧的列表。迭代修改列表是一件痛苦的事。