kal*_*mbe 11 java collections linked-list duplicates
我有嵌套的LinkedList,其中包含一些元素.我想从Outter LinkedList删除重复的内部LinkedList.元素的顺序无关紧要.[猫,鼠标,狗]与[鼠标,猫,狗]相同,我想删除他们中的一个.例:
假设
[[Cat,Mouse,Dog],[Dog,Mouse,Cat],[Dog,Horse,Cat],[Dog,Tiger,Lion]]
Run Code Online (Sandbox Code Playgroud)
然后我想要像这样的输出
[[Cat,Mouse,Dog],[Dog,Horse,Cat],[Dog,Tiger,Lion]]
Run Code Online (Sandbox Code Playgroud)
我试过了.但我想要最佳解决方案......我的代码如下
for (int iBoardListCnt = 0; this.roomCombinationsMasterList != null && iBoardListCnt < this.roomCombinationsMasterList.size(); iBoardListCnt++) {
LinkedList<Board> alRoomCombinationList = new LinkedList<>();
alRoomCombinationList = this.roomCombinationsMasterList.get(iBoardListCnt);
ArrayList<String> alTemp = new ArrayList();
for (int icount = 0; icount < alRoomCombinationList.size(); icount++) {
alTemp.add((alRoomCombinationList.get(icount).getRoomDescription() + alRoomCombinationList.get(icount).getDescription()).toString());
}
roomCombinationsMasterList.remove(iBoardListCnt);
Collections.sort(alTemp, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
});
Iterator<LinkedList<Board>> iterator = roomCombinationsMasterList.iterator();
while (iterator.hasNext()) {
ArrayList<String> alTemp1 = new ArrayList<>();
for (Board data : iterator.next()) {
alTemp1.add((data.getRoomDescription() + data.getDescription()).toString());
}
Collections.sort(alTemp1, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
});
if (alTemp.equals(alTemp1)) {
iterator.remove();
continue;
}
}
roomCombinationsMasterList.add(iBoardListCnt, alRoomCombinationList);
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我从Nested LinkedList中获取了Fist元素.存储在临时LinkedList中我从main arraylist中删除了该元素.现在我将LinkedList中的下一个元素存储到第二个临时LinkedList中.使用Comparator对LinkedList进行排序并使用equals()方法比较这两个LinkedList.如果两者相同,则使用Iterator删除其中的1个.请给我最优解决方案.
有多种方法可以从列表中删除重复元素。您想要的“最佳”解决方案将需要使用适当的数据结构,该数据结构针对contains操作进行了优化。在你的情况下它将是HashSet。
这个想法是,在遍历原始集合的同时,您维护遍历的元素集并检查当前元素是否已被遍历。此方法会就地修改您的原始集合。
List<List<String>> input = new LinkedList<List<String>>(Arrays.asList(
Arrays.asList("Cat", "Mouse", "Dog"),
Arrays.asList("Dog", "Mouse", "Cat"),
Arrays.asList("Dog", "Horse", "Cat"),
Arrays.asList("Dog", "Tiger", "Lion")));
Set<Set<String>> distinctElements = new HashSet<Set<String>>();
for (Iterator<List<String>> iterator = input.iterator(); iterator.hasNext(); ) {
List<String> element = iterator.next();
HashSet<String> elementAsSet = new HashSet<String>(element);
if (!distinctElements.contains(elementAsSet)) {
distinctElements.add(elementAsSet);
} else {
iterator.remove();
}
}
System.out.println(input);
Run Code Online (Sandbox Code Playgroud)
第二个选项是将原始列表转换为LinkedHashSet<LinkedHashSet<String>>. LinkedHashSet其行为类似于 aSet同时List(实际上,它在幕后有这两种数据结构)。因此,它会根据您的需要消除重复项,同时保留元素的顺序。也许这不是您的选择,正如您所说,您必须保留您的集合类型,但它仍然是一个值得考虑的好(且简短)选择。
LinkedHashSet<LinkedHashSet<String>> results = new LinkedHashSet<LinkedHashSet<String>>();
for (List<String> strings : input) {
results.add(new LinkedHashSet<>(strings));
}
System.out.println(results);
Run Code Online (Sandbox Code Playgroud)
最后是 Java 8 的一行代码:
LinkedList<LinkedList<String>> results = input.stream().map(LinkedHashSet::new).distinct()
.map(LinkedList::new).collect(Collectors.toCollection(() -> new LinkedList<LinkedList<String>>()));
Run Code Online (Sandbox Code Playgroud)
或者,如果您不关心返回集合的类型,则它是较短的版本:
List<List<String>> results = input.stream().map(LinkedHashSet::new).distinct()
.map(LinkedList::new).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |