0

我有一个声明如下

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

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

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

我总是得到作为插入顺序的输出,这就是为什么linkedHashSet是为

我需要以相反的顺序输出,以便最新日期排在第一位?

我听说过NavigableSet但它不适用于我的场景.. 有什么建议吗?

谢谢

4

3 回答 3

2

根据 javadoc,Set 的目的是消除元素集合中的重复项。为了反转集合的元素,您需要首先创建一个列表。这是示例:

ArrayList<String> list = new ArrayList<String>(orderSet);
Collections.reverse(list);
于 2014-05-18T14:05:27.340 回答
2

LinkedHashSet按插入顺序排序。在您按顺序获取事物的情况下(例如从数据库中的查询),这会维护您获取它们的顺序并为您提供 O(1) 查找(与 TreeSet 的 O(log n) 相比)。当对象的顺序不容易比较时,它也很有用。

LinkedHashSet 对缓存也特别有用(另见它的近亲LinkedHashMap,它提供了一种removeEldestEntry可用于实现 LRU 缓存的方法(驱逐对象以仅维护 100 个(或其配置的)最近使用的项目)。

但是, LinkedHashSet 不是接口NavigableSet的子类。这意味着不存在用于操作该集合的许多工具。要反转 NavigableSet,您可以获得descendingIterator()descendingSet()。那里还有其他一些位,例如能够获得某物的下一个最高值,或者从一个点到另一个点的子集。

有两个实现 NavigableSet 的类:ConcurrentSkipListSet(使用跳过列表)和TreeSet(使用红黑树)。

NavigableSet 的要求是元素对它们有一个排序(由 实现Comparable。这些包括StringDate,以及各种数字类,以及一大堆更多......或者就此而言,您实现 Comparable 的任何东西.

请注意,这些都是集合,这意味着结构中只有一个元素的副本。如果您实际上是在一个包含多个副本的列表之后,那么您就可以使用您的列表。这些是用于不同目的的不同工具。

于 2014-05-18T14:21:16.540 回答
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;
        }
    }
}
于 2014-05-18T14:37:37.150 回答