我有一个声明如下的集合
Set<String> orderSet = new LinkedHashSet <String>();
存储的字符串值是日期和时间约定的组合
orderSet.add(bean.getDate()+"," + bean.getTimeConvention());
我总是将输出作为插入顺序,这就是为什么linkHashSet是为
设计的我需要输出的顺序是相反的,以便最新的日期出现?
我听说过NavigableSet,但它对我的情景不起作用.. 有什么建议吗?
感谢
答案 0 :(得分:2)
根据javadoc,Set的目的是消除元素集合中的重复。要反转集合的元素,您需要先创建一个List。这是一个例子:
ArrayList<String> list = new ArrayList<String>(orderSet);
Collections.reverse(list);
答案 1 :(得分:2)
LinkedHashSet按插入顺序排序。如果您按顺序获取事物(比如从数据库中的查询中获取),这将维护您获得它们的顺序,并为您提供O(1)查找(与TreeSet的O(log n)相比)。当对象的排序不容易比较时,它也很有用。
LinkedHashSet对缓存也特别有用(另请参阅其{kin} LinkedHashMap,它为removeEldestEntry
提供了一种方法,可用于实现LRU缓存(驱逐对象仅维护100(或其配置的最近使用的项目)。
但是,LinkedHashSet不是接口NavigableSet的子类。这意味着不存在用于操纵该组的许多工具。要反转NavigableSet,您可以获得descendingIterator()
或descendingSet()
。还有其他位可以获得某个东西的下一个最高值,或者从一个点到另一个点的子集。
实现NavigableSet有两个类:ConcurrentSkipListSet(使用skip list)和TreeSet(使用红黑树)。
NavigableSet的要求是元素对它们有一个排序(由Comparable
实现。这些包括String,Date,以及各种数字类,以及whole bunch more ......或者就此而言,你实施的任何东西都是可比较的。
请注意,这些都是 sets ,这意味着结构中只有一个元素的副本。如果您实际上是在具有多个副本的List之后,那么您已经获得了列表。这些是用于不同目的的不同工具。
答案 2 :(得分:1)
我就是这样做的:
import java.util.Date;
import java.util.Map;
import java.util.NavigableSet;
import java.util.TreeSet;
public class DescendingSetTest {
public static void main(String[] args) {
NavigableSet<Map.Entry<Date, String>> set = new TreeSet<Map.Entry<Date, String>>();
set.add(newEntry(new Date(0), "0000"));
set.add(newEntry(new Date(700000000000l), "0000"));
set.add(newEntry(new Date(700000000000l), "9999"));
for (Map.Entry<Date, String> entry : set.descendingSet())
System.out.println(entry);
}
public static <K extends Comparable<? super K>, V extends Comparable<? super V>> Map.Entry<K, V> newEntry(K key, V value) {
return new Entry<K, V>(key, value);
}
private static class Entry<K extends Comparable<? super K>, V extends Comparable<? super V>> implements Map.Entry<K, V>, Comparable<Entry<K, V>> {
private K key;
private V value;
Entry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
throw new UnsupportedOperationException();
}
@Override
public int compareTo(Entry<K, V> that) {
int c = key.compareTo(that.key);
return c != 0 ? c : value.compareTo(that.value);
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object that) {
return that instanceof Entry<?, ?> ? compareTo((Entry<K, V>)that) == 0 : false;
}
@Override
public String toString() {
return key + "," + value;
}
}
}