java LinkedHashSet是否按降序排列元素?

x6h2sr28  于 2023-05-05  发布在  Java
关注(0)|答案(4)|浏览(124)

我有一个声明如下的集合

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

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

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

我总是以插入顺序获得输出,这就是为什么linkedHashSet是为
我需要的输出是在相反的顺序,使最新的日期是第一?
我听说过NavigableSet,但它不适合我的场景。有什么建议吗?
谢谢

dvtswwa3

dvtswwa31#

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

ArrayList<String> list = new ArrayList<String>(orderSet);
Collections.reverse(list);
83qze16e

83qze16e2#

LinkedHashSet按插入顺序排序。在你按顺序获取事物的情况下(比如从数据库中的查询),这会保持你获取它们的顺序,并为你提供O(1)的查找(与TreeSet的O(log n)相比)。当对象的顺序不容易比较时,它也很有用。
LinkedHashSet对于缓存也特别有用(参见它的同类LinkedHashMap,它为removeEldestEntry提供了一个方法,可以用来实现LRU缓存(驱逐对象以仅维护100个(或任何其配置)最近使用的项目)。
然而,LinkedHashSet不是接口NavigableSet的子类。这意味着不存在用于操纵集合的许多工具。要反转NavigableSet,可以获取descendingIterator()descendingSet()。还有其他的比特,比如能够得到某个东西的下一个最高值,或者从一个点到另一个点的子集。
有两个实现NavigableSet的类:ConcurrentSkipListSet(使用skip list)和TreeSet(使用红黑树)。
NavigableSet的要求是元素具有顺序(如Comparable所实现的)。其中包括String,Date,以及各种数字类,以及whole bunch more ...或者说,任何你实现的Comparable。
请注意,这些都是***集合***,这意味着结构中只有一个元素的副本。如果您实际上是在一个列表与多个副本后,那么你有你的名单工作。这些是用于不同目的的不同工具。

tyg4sfes

tyg4sfes3#

我会这样做:

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;
        }
    }
}
ajsxfq5m

ajsxfq5m4#

LinkedHashMap按插入顺序或最后访问顺序对元素进行排序。对于一个有排序元素的集合,SortedSet或它的子类NavigableSet通常是更好的选择。
你说NavigableSet不适合你的场景。没有细节很难判断那句话的正确性。以防万一它实际上对你或其他阅读这个问题的人有用,下面是它的样子:

Set<String> orderSet = new TreeSet<>(Comparator.reverseOrder());
orderSet.add(bean.getDate()+"," + bean.getTimeConvention());

相关问题