将Java放入特定顺序的TreeMap中

4

我有一个大列表,将其放入treemap中。

然后我想把"ALL"放在列表的最顶端,但是有一个名为"AAA"的东西排在"ALL"之前。

编辑:我还希望所有其他输入都能被排序。

List     ->    List
-----          -----
AAA            AAA
BBB            ALL
CCC            BBB
               CCC

我可以使用ArrayList或其他一些方法,但我想知道是否有办法控制这种情况。


所以你希望无论添加什么,所有内容都保持在顶部? - tgoossens
您是否希望对除了键为“ALL”之外的其余条目进行排序? - user845279
4个回答

6

一种选择是构建一个自定义比较器,始终将单词“ALL”排在其他所有单词之前:

TreeMap<String, T> myMap = new TreeMap<String, T>(new Comparator<String>() {
    public int compare(String lhs, String rhs) {
        /* See which of the inputs, if any, are ALL. */
        bool oneAll = lhs.equals("ALL");
        bool twoAll = rhs.equals("ALL");

        /* If both are ALL or neither are ALL, just do a normal comparison. */
        if (oneAll == twoAll) {
            return lhs.compareTo(rhs);
        }
        /* Otherwise, exactly one of them is ALL.  Determine which one it is and
         * react accordingly.
         */
        else if (oneAll) {
            return -1;
        } else {
            return +1;
        }
    }
});

这将按升序对所有内容进行排序,但优先考虑"ALL"。希望这有所帮助!

4
不要使用 TreeMap。如果您想按特定顺序放置东西,只需使用 ArrayList 或 LinkedList。 TreeMap 按其键的顺序排序条目。 在这种情况下,您不希望出现这种情况。
编辑:如果您只关注将 ALL 放在顶部,那么自定义比较器就可以了。 但是,如果您真的想以一种不能纯粹通过涉及的键轻松确定每个条目的位置的方式来指定每个条目的位置,那么我坚持认为 TreeMap 不是正确的选择。

我认为OP想要将所有内容排序,但是希望“ALL”始终排在最上面。如果是这样的话,这个解决方案可能不是最理想的。 - templatetypedef
1
完全不同意。如果我们无法控制插入顺序,TreeMap是理想的选择。这就是为什么有一个Comparator< T >接口。 - Judge Mental
2
@JudgeMental:这取决于排序是由键本身还是某些外部选项引起的。如果只是“ALL”排在所有东西之前,那么可以使用Comparator来完成。如果您需要除键中包含的数据之外的其他数据,则不太合适。 - Jon Skeet

1

您可以编写自己的 compareTo() 方法,以便将 ALL 始终排在最上面。


1

使用LinkedHashMap可以让你保持元素添加到映射中的相同顺序。如果需要自定义顺序,可以使用自己的比较器与TreeMap一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接