【问题标题】:TreeMap high-low key Integer sortTreeMap 高低键整数排序
【发布时间】:2014-09-16 13:49:46
【问题描述】:
    Map<Integer, String> map = new TreeMap<Integer, String>();

    // Add Items to the TreeMap
    map.put(new Integer(8), "Eight");
    map.put(new Integer(9), "Nine");
    map.put(new Integer(1), "One");
    map.put(new Integer(4), "Four");
    map.put(new Integer(10), "Ten");
    map.put(new Integer(5), "Five");
    map.put(new Integer(6), "Six");
    map.put(new Integer(2), "Two");
    map.put(new Integer(3), "Three");
    map.put(new Integer(7), "Seven");

    keys = map.keySet();
    for (Iterator i = keys.iterator(); i.hasNext();) {
      Integer key = (Integer) i.next();
      String value = (String) map.get(key);
      System.out.println(key + " = " + value);
    }

输出:

  • 1 = 一
  • 2 = 两个
  • 3 = 三
  • 4 = 四个
  • 5 = 五
  • 7 = 七
  • 8 = 八
  • 9 = 九
  • 10 = 十个

我想反转 TreeMap 的这种整数排序, 所以最高整数将在前面,最低和最后,我怎样才能做到这一点?提前致谢。

【问题讨论】:

    标签: java sorting integer treemap


    【解决方案1】:

    TreeMap的构造函数可以带Comparator你可以通过自定义实现

    更改您的 Map 声明以传递逆序比较器

    Map<Integer, String> map = new TreeMap<Integer, String>(Collections.reverseOrder());
    

    另见

    【讨论】:

    • 这似乎工作 'Collections.reverseOrder()',我不了解比较器,但这似乎是最简单的解决方法。
    • Comparator 是一个帮助排序算法比较两个对象的接口,例如你知道 1 p2,Comparator 在那里有帮助,请参阅javadoc 链接
    【解决方案2】:

    怎么样

    NavigableMap<Integer, String> map = new TreeMap<Integer, String>();
    
    for(Map<Integer, String> entry : map.descendingMap().entrySet())
         System.out.println(entry); // prints key = value
    

    【讨论】:

    • 这似乎是最简单的方法,因为我对比较器的了解接近于零。我唯一的问题是为什么一开始就使用 NavigableMap 而不是 TreeMap?
    • @user2803086 如果代码中不直接需要访问特定的底层实现类型,则使用更高级别的接口抽象被认为是一种好习惯。这样做的原因是,如果您将来希望这样做,它可以很容易地更改实现类型(并且您不受任何需要较低级别类型的合同的约束)。这绝不是一项要求,实际上您可能很少会真正更改集合类的实现类型,但好的做法就是好的做法。
    • 您只能在一个地方将 TreeMap 替换为 ConcurrentSkipListMap 或其他此类地图。 NavigableMap 明确表示这是最低要求。
    • @increment1 我知道 List 是 ArrayList 的底层,但我从来不知道为什么。这种做法有什么名字吗,因为我当然想知道这是怎么做到的。提前致谢
    • 如果您有List&lt;String&gt; list = new ArrayList&lt;&gt;();,您的list 是任何实现Listreference 这意味着您可以使用任何其他实现而不更改使用的代码它。即List&lt;String&gt; list = new CopyOnWriteArrayList&lt;&gt;();,无需更改任何其他内容。这称为继承和多态。
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多