LinkedHashSet按降序排列元素?

时间:2014-05-18 13:52:04

标签: java collections set linkedhashset

我有一个声明如下的集合

Set<String> orderSet = new LinkedHashSet <String>();

存储的字符串值是日期和时间约定的组合

orderSet.add(bean.getDate()+"," + bean.getTimeConvention());

我总是将输出作为插入顺序,这就是为什么linkHashSet是为

设计的

我需要输出的顺序是相反的,以便最新的日期出现?

我听说过NavigableSet,但它对我的情景不起作用.. 有什么建议吗?

感谢

3 个答案:

答案 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实现。这些包括StringDate,以及各种数字类,以及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;
        }
    }
}