- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有包含一些元素的嵌套链表。我想从外部链表中删除重复的内部链表。元素的顺序无关紧要。[Cat,Mouse,Dog] 与 [Mouse,Cat,Dog] 相同,我想要删除其中 1 个。示例:
假设
[[Cat,Mouse,Dog],[Dog,Mouse,Cat],[Dog,Horse,Cat],[Dog,Tiger,Lion]]
然后我想要这样的输出
[[Cat,Mouse,Dog],[Dog,Horse,Cat],[Dog,Tiger,Lion]]
我试过了。但我想要最优解……我的代码如下
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);
}
在这段代码中,我从 Nested LinkedList 中获取了 Fist 元素。存储在临时 LinkedList 中,我从主数组列表中删除了该元素。现在我将 LinkedList 中的下一个元素存储到第二个临时 LinkedList 中。使用 Comparator 对两个 LinkedList 进行排序并使用 equals() 方法比较这两个 LinkedList。如果两者相同,则使用 Iterator 删除其中的一个。请给我最佳解决方案。
最佳答案
有多种方法可以从列表中删除重复元素。您要达到的“最佳”解决方案将需要使用适当的数据结构,该结构已针对 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);
第二个选项是将您的原始列表列表转换为 LinkedHashSet<LinkedHashSet<String>>
. LinkedHashSet
表现得像 Set
和 List
同时(实际上,它有这两种数据结构)。因此它消除了重复项,同时保留了元素的顺序,正如您所需要的那样。正如您所说,您必须保留您的 Collection 类型,这可能不是您的选择,但它仍然是一个值得考虑的好(和短)选择。
LinkedHashSet<LinkedHashSet<String>> results = new LinkedHashSet<LinkedHashSet<String>>();
for (List<String> strings : input) {
results.add(new LinkedHashSet<>(strings));
}
System.out.println(results);
最后是 Java 8 的一行代码:
LinkedList<LinkedList<String>> results = input.stream().map(LinkedHashSet::new).distinct()
.map(LinkedList::new).collect(Collectors.toCollection(() -> new LinkedList<LinkedList<String>>()));
或者如果您不关心返回集合的类型,它是更短的版本:
List<List<String>> results = input.stream().map(LinkedHashSet::new).distinct()
.map(LinkedList::new).collect(Collectors.toList());
关于java - 从 LinkedList 中删除重复项,其中嵌套的集合项可以按任意顺序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31934208/
我想添加 LinkedList (我们称之为列表 A)到 LinkedList> (称之为列表 B)。执行此操作后,我需要更改列表 A 的值并将其再次添加到列表 B,但不更改已存储在列表 B 中的值。
更新:感谢所有的回答。我发现的最干净的解决方案是这个: if ( k(Arrays.asList(new LinkedList<>())); 我有一个递归方法,可以从列表中生成所有“n 选 k”组合。
在我的 Java 应用程序中,以下两个都将编译和运行,并产生所需的结果。 //"Rotate" the list items one place to the left. myLinkedList.a
我写了一个LinkedList接受 Nodes 的类存储 Integers . 然后我创建了一个 LinkedList stack = new LinkedList() ,并添加了 Node s 如果
这个问题在这里已经有了答案: What does it mean to "program to an interface"? (33 个答案) 关闭 9 年前。 新手 Java 问题: 谁能解释一下
我有一个问题。我无法并排输出我的 LinkedList。我问了这个问题,但遗憾的是我的老师告诉我不要更改方法头或使用 java 库(如日历)。我得到了很多关于使用它或更改方法头的建议。我是根据年级而定
这里有什么问题?。我正在尝试使用邻接列表,通过利用 util 包中的集合来实现图形数据结构。这里 LinkedList array which holds some integer. Each ele
这个问题已经有答案了: Reversing a linked list in Java, recursively (33 个回答) 已关闭10 年前。 如何使用 linkedList 类中的方法以相反
我需要实现一个 LinkedList,到目前为止,我已经编写了在列表中按顺序插入值的方法。我有我的节点 front 作为我的类的实例数据,当创建我的第一个值并尝试将 front 的 next 值设置为
目前,我的 LinkedList(不是 Java 的)类中有一个方法,可以将单个节点添加到 LinkedList 中,如下所示: public void add(int index, T v) {
我正在编写一个读取 XML 文件的类,该 XML 使用“sax”类进行解析。在我的 XML 文件中,我创建了“for”标签和“宏”,使 for 循环能够写入 XML,例如: Th
我正在处理一个 C++ 作业,我将在一个链表的链表上创建一个搜索引擎。根据要求,我不能使用其他库和 STL。 基本上它会是这样的(我从小列表中删除了变量,因为它们是不相关的): 我的结构是这些: st
老实说,我现在真的很困惑这个问题,并且真的不知道如何解决这个问题。我需要编写一个方法,其中给定一个字符链接列表(例如:{'a','A','d','X'})并返回仅包含大写字符的列表(返回:{'A','
我正在尝试获取可执行文件中的两个链表,并在交替位置将它们合并到一起。前任。 ListOne 1,2,3 和 ListTwo 4,5 新的 ListOne 应该是 1,4,2,5,3。 链表.h文件:
这个问题在这里已经有了答案: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答
在尝试了解如何将哈希表插入LinkedLists时,我遇到了麻烦。我失去了尝试过的不同事物的数量。我知道我可以使用ArrayList或其他东西,但是我想使它与LinkedLists一起工作,以便可以对
我一直在尝试编写一种方法,不仅可以从 LinkedList(allUsers) 中删除对象(User),还可以从所有用户拥有的单个 LinkedList 中删除。谁能向我解释为什么这是错误的?我已经包
我有一个列表结构和一个名为树的递归函数。在下面的代码中,它永远不会到达 current == null 语句,因此它将永远运行。 如果我无法使用null,解决方案是什么? private void t
这个问题在这里已经有了答案: How does one add a LinkedList to a LinkedList in C#? (3 个答案) 关闭 9 年前。 假设我有以下内容: Link
我正在尝试为 LinkedList 创建一个反向 ListIterator,并且打算将其实现为 linkedList.listIterator(linkedList. size()) 交换了 next
我是一名优秀的程序员,十分优秀!