- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试维护 ConcurrentSkipListSet 中的插入顺序。正在添加的项目是具有 value(String) 和 index (int) 属性的自定义类类型。它实现了 Comparable 接口(interface)。该集合的行为非常不一致,有时会添加重复的项目。如果项目具有相同的值,则认为它们是重复的。
// This is the Item class being added in the set.
final class Item implements Comparable<Item> {
private String value;
private int index;
Item(String val, int idx) {
this.value = val;
this.index = idx;
}
@Override
public int compareTo(Item o) {
// returns zero when values are equal indicating it's a duplicate item.
return this.value.equals(o.value) ? 0 : this.index - o.index;
}
@Override
public String toString() {
return this.value;
}
}
// Below is the main class.
public class Test {
ConcurrentSkipListSet<Item> set;
AtomicInteger index;
public Test() {
set = new ConcurrentSkipListSet<>();
index = new AtomicInteger(0);
}
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
Test test = new Test();
test.addItems();
test.assertItems();
}
}
//trying to test it for 10 times. It always fails for once or twice.
private void assertItems() {
Iterator<Item> iterator = set.iterator();
String[] values = {"yyyy", "bbbb", "aaaa"};
for (String value : values) {
if (!value.equals(iterator.next().toString())) {
System.out.println("failed for :" + set);
return;
}
}
System.out.println("passed for :" + set);
}
//adding items with some duplicate values
private void addItems() {
set.add(new Item("yyyy", index.getAndIncrement()));
set.add(new Item("bbbb", index.getAndIncrement()));
set.add(new Item("yyyy", index.getAndIncrement()));
set.add(new Item("aaaa", index.getAndIncrement()));
}
预期:通过:[yyyy, bbbb, aaaa]
实际:失败:[yyyy, bbbb, yyyy, aaaa]
但如前所述,结果很不一致。大多数时候,它会过去。请告知此行为的可能原因。 “compareTo()”方法是否错误?如果是这样,它应该总是失败。
理想情况下,我们也应该覆盖“equals()”方法。但从有序集的角度来看,这并不重要。
感谢您的帮助。
最佳答案
你坏了the contract of compareTo
,这会导致未定义的行为。
Finally, the implementor must ensure that
x.compareTo(y)==0
implies thatsgn(x.compareTo(z)) == sgn(y.compareTo(z))
, for all z.
通过将项目拉出到变量中,您可以很容易地看到您未满足此要求:
final Item x = new Item("yyyy", index.getAndIncrement());
final Item z = new Item("bbbb", index.getAndIncrement());
final Item y = new Item("yyyy", index.getAndIncrement());
System.out.println(x.compareTo(y));
System.out.println(x.compareTo(z));
System.out.println(y.compareTo(z));
输出:
0
-1
1
标志不同,因此契约(Contract)已被破坏。
关于java - 在 ConcurrentSkipListSet 中添加了重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128934/
我有一个 ConcurrentSKipListSet ,我正在用 for-each 迭代这个集合中的值循环。 另一个线程在某个时候将从这个集合中删除一个元素。 我想我遇到了这样一种情况:一个线程删除了
问题:ConcurrentSkipListSet(csls) 的 contains 和 add 的文档声明如下: 公共(public) boolean 添加(E e)如果指定元素尚不存在,则将其添加到
据我了解,ConcurrentSkipListSet 的平均复杂度为 O(log n),用于插入、搜索和删除元素,最坏情况为 O(n)。如何访问第一个和最后一个元素?它比日志低吗?我看到它保留了一个指
我刚刚在 Java 6 API 上看到了这个数据结构,我很好奇它什么时候会成为有用的资源。我正在为 scjp 考试而学习,但我没有看到 Kathy Sierra 的书涵盖了它,尽管我看过提到它的模拟考
我正在尝试使用 queue = new ConcurrentSkipListSet(Comparators.comparing(Task::priority)) 作为具有独特元素的并发优先级队列(参见
在迭代 ConcurrentSkipListSet 时删除和添加元素是否安全: ConcurrentSkipListSet set = new ConcurrentSkipListSet(myComp
我正在使用 ConcurrentSkipListSet 集合来处理并发运算符。我发现它有时会卡住,用以下代码重现: import java.util.Comparator import java.ut
我想包装 ConcurrentSkipListSet保持最新的固定容量(根据 Comparator )值: private int capacity = 100; // using Integer j
我不确定 java.util.concurrent.ConcurrentSkipListSet 是否存在问题?我正在尝试将一些对象添加到 ConcurrentSkipListSet (由我自己的比较器
我正在尝试维护 ConcurrentSkipListSet 中的插入顺序。正在添加的项目是具有 value(String) 和 index (int) 属性的自定义类类型。它实现了 Comparabl
我正在使用一个 ConcurrentSkipListSet,它显然是通过多个线程访问的。现在,底层对象的 compareTo 方法使用的值会随着时间的推移而改变。因此,我想“更新”列表的顺序(通过求助
这篇文章的摘要:我有一组订购的物品,它们的顺序可能会随着时间的推移而改变。我需要能够从多个线程遍历这个集合,每个线程可能还想更新项目的顺序。 比如多个线程需要访问String以某种任意排序顺序的键。它
我正在使用 ConcurrentSkipListSet 并使用 contains 方法。 根据包含方法的 JAVA 文档 如果此集合包含指定元素,则返回 true。更正式地说,当且仅当此集合包含满足
我需要一个非常快速(插入、删除、包含)的高度并发 列表,它可以使用比较器/可比较对象进行排序。 现有的 ConcurrentSkipListSet 将是理想的,如果它是一个列表而不是一个集合。我需要将
我理解的唯一区别是迭代器之间。 SkipList有 弱一致 , 而 TreeSet有 快速失败 .除此之外,我在 SkipList 中看不到任何同步方法。 (虽然它在 Concurrent 包中)。
我想要一组并发的字符串值,按长度最长 -> 最短排序。 这是我的代码(JAVA 8): private ConcurrentSkipListSet sortedSourceTypeNames = ne
等待ConcurrentSkipListSet修复( http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8060435 ),我的大脑无法尝试找到解
我正在考虑将一些使用 java.util.concurrent.ConcurrentSkipListSet 的代码移植到此类不可用的环境(特别是 android 2.2)。因此,我正在寻找它的替代品。
我在 ConcurrentSkipListSet 上使用 descendingIterator 方法。我刚刚查看了文档并注意到以下评论: “升序 View 及其迭代器比降序 View 更快。” 参见
通常,并发集合可以安全地进行迭代;根据 Javadoc 的说法:'迭代器是弱一致的,返回的元素反射(reflect)了在迭代器创建时或自创建迭代器后的某个时刻集合的状态。它们不会抛出 Concurre
我是一名优秀的程序员,十分优秀!