他们之间有什么区别?我知道
LinkedHashSet是HashSet的有序版本,它维护所有元素的双向链接列表.在关心迭代顺序时,请使用此类而不是HashSet.当您遍历HashSet时,顺序是不可预测的,而LinkedHashSet允许您按照插入顺序迭代元素.
但是在LinkedHashSet的源代码中,只有HashSet的调用构造函数.那么双链接列表和插入顺序在哪里?
我需要一个保持插入顺序并具有唯一值的集合.LinkedHashSet看起来像是要走的路,但是有一个问题 - 当两个项相等时,它会移除最新的一个(这是有意义的),这是一个例子:
set.add("one");
set.add("two");
set.add("three");
set.add("two");
Run Code Online (Sandbox Code Playgroud)
该LinkedHashSet会打印:
one,two,three
但我需要的是:
one,three,two
这里最好的解决方案是什么?是否有任何可以执行此操作的集合/集合方法,还是应该手动实现它?
我有一个 LinkedHashSet,即一个有序集.我正在尝试找到一个函数来返回集合的子集,即集合的前20个元素.我知道我可以通过创建一个新的集合,然后使用第一集的迭代填充,但我希望更简洁的东西.
还看了一下Google的Guava库,但看不到我想要的东西.
如何迭代LinkedHashSet从最后一项到第一项的a 项?
hibernate是否保留LinkedHashSet的顺序,如果是,如何?如果这取决于数据库的类型,我想知道PostgreSQL的这个.
背景:
我知道LinkedHashSet的用途是什么,我问这个的原因是因为我将我执行的一些函数的名称记录到'logError'表中,该表与某些'functionName'表有多对多的关系.我需要这些函数保持与执行它们时的顺序相同,所以首先我找到相应的'functionName'对象,将它们放在LinkedHashSet中(在每个失败的函数之后),然后我坚持'logError'对象.
现在当我再次从数据库中获取'logError'对象时,它仍然会被订购吗?如果是这样,我很好奇Hibernate如何做到这一点.
考虑以下SSCCE:
public static void main(String[] args) {
LinkedHashSet<String> set1 = new LinkedHashSet<>();
set1.add("Bob");
set1.add("Tom");
set1.add("Sam");
LinkedHashSet<String> set2 = new LinkedHashSet<>();
set2.add("Sam");
set2.add("Bob");
set2.add("Tom");
System.out.println(set1);
System.out.println(set2);
System.out.println(set1.equals(set2));
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[Bob, Tom, Sam]
[Sam, Bob, Tom]
true
Run Code Online (Sandbox Code Playgroud)
然而,如果你LinkedHashSet改为LinkedList:
public static void main(String[] args) {
LinkedList<String> set1 = new LinkedList<>();
set1.add("Bob");
set1.add("Tom");
set1.add("Sam");
LinkedList<String> set2 = new LinkedList<>();
set2.add("Sam");
set2.add("Bob");
set2.add("Tom");
System.out.println(set1);
System.out.println(set2);
System.out.println(set1.equals(set2));
}
Run Code Online (Sandbox Code Playgroud)
它产生:
[Bob, Tom, Sam]
[Sam, Bob, Tom]
false
Run Code Online (Sandbox Code Playgroud)
我的问题是澄清.有人可以帮助理解这个吗?为什么一个LinkedHashSet被认为是平等的,而同样的LinkedList呢?我假设定义List …
有人可以解释一个选择另一个的主要好处以及该选择带来的不利因素吗?
我正在寻找将给定集合划分为不相交子集的代码.例如,一组足球运动员,我们根据他们所属的球队对他们进行分区.我最终想要一份代表名单,即每队的一名球员.
所有足球运动员都了解球队中的所有其他球员 - 这与复杂性非常相关.所以,我目前关于如何做到这一点的想法如下(set目前在哪里LinkedHashSet<T>):
while (!set.isEmpty()) {
E e = set.iterator().next();
makeRepresentative(e);
set.remove(AllPlayersOnSameTeamAs(e));
}
Run Code Online (Sandbox Code Playgroud)
但是,在while循环的每个步骤中构建一个新的迭代器感觉很奇怪.LinkedHashSet应该在firstElement()内部具有某种功能(对于其LinkedList行为),但由于某种原因我无法找到如何执行此操作.我也试过了一个foreach循环,但结果是一个java.util.ConcurrentModificationException.
我该如何正确地做到这一点?
使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
Run Code Online (Sandbox Code Playgroud)
LinkedHashSet 有没有一种简单的方法可以实现这一点?
在Java中,LinkedHashSet是使用支持HashSet创建的,使用以下LinkedHashMap构造函数创建LinkedHashMap
map = new LinkedHashMap<>(initialCapacity, loadFactor);
Run Code Online (Sandbox Code Playgroud)
现在在LinkedHashMap中,上面的构造函数依次调用
public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
accessOrder = false;
}
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以将LinkedHashSet accessOrder设置为true?这可以帮助使用LinkedHashSet创建LRU缓存实现.
java ×10
linkedhashset ×10
collections ×2
set ×2
equals ×1
hashset ×1
hibernate ×1
insertion ×1
iteration ×1
iterator ×1
linked-list ×1
list ×1
subset ×1