Я пытаюсь сохранить порядок вставки в ConcurrentSkipListSet. Добавляемый элемент - это пользовательский тип класса со свойствами value (String) и index (int). Он реализует сопоставимый интерфейс. Набор ведет себя очень противоречиво, иногда добавляя дубликаты предметов. Элементы считаются дублирующими, если они имеют одинаковое значение.
// 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()));
}
Ожидается: передано для: [гггг, bbbb, аааа]
Фактически: не удалось: [гггг, bbbb, гггг, аааа]
Но, как упоминалось ранее, результат очень противоречивый. В большинстве случаев это проходит.
Пожалуйста, дайте знать, что может быть причиной такого поведения. Является ли метод «CompareTo ()» неправильным? Если это так, он всегда должен потерпеть неудачу.
В идеале мы должны также переопределить метод equals (). Но это не имеет значения с точки зрения отсортированного набора.
Ценю вашу помощь.