【问题标题】:How to reverse the order of SortedSet如何反转SortedSet的顺序
【发布时间】:2016-05-09 10:18:27
【问题描述】:

我想使用以下命令在 Map 中打印一个有序列表:

Map<Float, String> mylist = new HashMap<>();

mylist.put(10.5, a);
mylist.put(12.3, b);
mylist.put(5.1, c);

SortedSet<Float> orderlist = new TreeSet<Float>(mylist.keySet());

for (Float i : orderlist) {
    System.out.println(i+" "+mylist.get(i));
}

以上代码打印:

5.1 c
10.5 a
12.3 b    

但是我如何以相反的顺序打印订单列表,如下所示:

12.3 b
10.5 a
5.1 c

【问题讨论】:

  • 您反对将集合中的项目放在另一个数据结构中吗?此外,您是否需要将 SortedSet 中的项目按照它们已经在其中的特定顺序存放,或者您是否可以按相反的顺序存储它们?
  • 我只想打印列表。如果有更好的方法,则不需要 SortedSet。如果我可以以相反的顺序存储物品就可以了。

标签: java treeset sortedset


【解决方案1】:

你可以试试这个实现(source):

public sealed class OrderedSet<T> : ICollection<T>
{
    private readonly IDictionary<T, LinkedListNode<T>> _dictionary;
    private readonly LinkedList<T> _linkedList;

    public OrderedSet()
        : this(EqualityComparer<T>.Default)
    {
    }

    private OrderedSet(IEqualityComparer<T> comparer)
    {
        _dictionary = new Dictionary<T, LinkedListNode<T>>(comparer);
        _linkedList = new LinkedList<T>();
    }

    public int Count => _dictionary.Count;

    public bool IsReadOnly => _dictionary.IsReadOnly;

    void ICollection<T>.Add(T item)
    {
        Add(item);
    }

    public void Clear()
    {
        _linkedList.Clear();
        _dictionary.Clear();
    }

    public bool Remove(T item)
    {
        var found = _dictionary.TryGetValue(item, out var node);
        if (!found)
        {
            return false;
        }

        _dictionary.Remove(item);
        _linkedList.Remove(node);
        return true;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _linkedList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public bool Contains(T item)
    {
        return _dictionary.ContainsKey(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _linkedList.CopyTo(array, arrayIndex);
    }

    public void Add(T item)
    {
        if (_dictionary.ContainsKey(item))
        {
            return;
        }

        var node = _linkedList.AddLast(item);
        _dictionary.Add(item, node);
    }

    public void Reverse()
    {
        var head = _linkedList.First;
        while (head.Next != null)
        {
            var next = head.Next;
            _linkedList.Remove(next);
            _linkedList.AddFirst(next.Value);
        }
    }
}

请注意,这是一个OrderSet,它保留了插入顺序,而SortedSet 则根据某个比较器(例如按字母顺序)对集合进行排序。

我从here 添加了Reverse() 方法。

【讨论】:

    【解决方案2】:

    你也可以试试这个:

        Map<Float, String> mylist = new HashMap<Float, String>();
        mylist.put(10.5, a);
        mylist.put(12.3, b);
        mylist.put(5.1, c);
    
        SortedSet<Float> orderlist = new TreeSet<Float>(mylist.keySet()).descendingSet();
    
        for (Float i : orderlist) {
            System.out.println(i+" "+mylist.get(i));
        }
    

    【讨论】:

      【解决方案3】:

      如果您愿意以相反的顺序将元素存储在SortedSet 中,您需要做的唯一更改是使用an appropriate constructor 构造TreeSet,它采用自定义Comparator

      Map<Float, String> mylist = new HashMap<>();
      
      mylist.put(10.5, a);
      mylist.put(12.3, b);
      mylist.put(5.1, c);
      
      SortedSet<Float> orderlist = new TreeSet<Float>(Collections.reverseOrder());
      orderList.addAll(mylist.keySet());
      
      for (Float i : orderlist) {
          System.out.println(i+" "+mylist.get(i));
      }
      

      注意这里的简洁方法是Collections.reverseOrder(),它返回一个Comparator,它与元素的自然顺序相反。

      【讨论】:

      【解决方案4】:

      尝试使用NavigableSet:

       public NavigableSet<E> descendingSet()
      

      像这样:

        SortedSet<Float> orderlist = new TreeSet<Float>(mylist.keySet());
        SortedSet<Float> treereverse = new TreeSet<Float>();
        // creating reverse set
        treereverse=(TreeSet)orderlist.descendingSet();
      

      最后你有treereverse 与相反的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2021-11-18
        • 2021-11-17
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        相关资源
        最近更新 更多