首页 文章

使用TreeSet进行排序而不向其提供Comparator

提问于
浏览
3

我知道java中的 TreeSet 会按升序自动对其元素进行排序,以保证顺序 .

例如,如果我有一个 Date 对象的数组随机,我将其复制到 TreeSet 然后它将以 TreeSet 以排序方式添加 .

但是假设不是一个简单的 Date 对象,我的 ArrayListHashMap<String,Object> ,格式如下 .

arraylist的第一个 Value ,

{mydate = 32156464 , mystring = "abc", mystring2 = "xyz"}

hashmap的arraylist中的第二个值,

{mydate = 64687678 , mystring = "abdc", mystring2 = "xyzzz"}

hashmap的arraylist中的第3个值,

{mydate = 11233678 , mystring = "abxdc", mystring2 = "xyzppzz"}

现在,如果我想基于 mydate 键对这个hashmap的arraylist进行排序,我必须在 TreeSet 实例中创建一个新的比较器,如下所示,

public static Set<HashMap<String, Object>> mySet = new TreeSet<>(new Comparator<HashMap<String, Object>>() {
        @Override
        public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) {
            return ((Date) o2.get(mydate)).compareTo((mydate) o1.get(DATE));
        }
    });

并且它会按照排序顺序将arraylist存储在 TreeSet 内 . 但我使用自定义 Comparator 来实现这一目标 . 如果我还提供自定义 Comparator ,在这种情况下使用 TreeSet 分类数据有什么意义呢?

如何在不使用 TreeSetComparator 的新实例的情况下,根据 date 值对 ArrayList ArrayList 进行排序?

4 回答

  • 1

    如果我还提供自定义Comparator,在这种情况下使用TreeSet对数据进行排序有什么意义呢?

    因为它是 TreeSet 代码,使它保持排序 . 您没有必须提供任何代码 - 您必须提供的是自定义比较 .

    如何在不使用TreeSet中的新Comparator实例的情况下,根据日期值对HashMap的ArrayList进行排序?

    你不能,直接 . 你可以写一个 HashMap 的子类,它自己实现了 Comparable ,但这对我来说似乎有些奇怪 . 例如:

    public class SpecialMap extends HashMap<String, Object>
        implements Comparable<SpecialMap> {
    
        private final String key;
    
        public SpecialMap(String key) {
            this.key = key;
        }
    
        public int compareTo(SpecialMap other) {
            // TODO: Null handling
            Date thisDate = (Date) this.get(key);
            Date otherDate = (Date) other.get(key);
            return thisDate.compareTo(otherDate);
        }
    }
    

    然后你可以有一个 ArrayList<SpecialMap> 然后排序 .

    但鉴于你必须提供与比较器基本相同的代码并将你的比较与 Map 类型绑定,我觉得最好只坚持使用比较器 .

  • 1

    如果你没有向 TreeSet 提供 Comparator ,那么它将依赖它的元素 Comparable 来对它们进行排序 . 如果它们不是 Comparable ,则会产生 ClassCastException . TreeSet javadocs解释:

    基于TreeMap的NavigableSet实现 . 元素按照其自然顺序排序,或者在创建时创建时提供的比较器,具体取决于使用的构造函数 .

    HashMap 类不是 Comparable ,因此您必须提供自定义 Comparator ,以便 TreeSet 知道您要如何对它们进行排序 . 如果没有 Comparator ,您无法对 HashMap 进行排序,无论它们是在 TreeSet 还是其他任何集合中 .

    在这种情况下使用 TreeSet 是有好处的 . 添加,查找和删除操作是O(log n) . 如果您为此使用 ArrayList ,则添加和删除操作将为O(n),即使查找操作仍为O(log n) .

    更多来自 TreeSet javadocs:

    此实现为基本操作(添加,删除和包含)提供了有保证的log(n)时间成本 .

  • 4

    您可以创建一个包含mydate,mystring,mystring2并实现Comparable接口的类,而不是使用HashMap .

    但是,使用比较器是一种很好的做法,因为您将能够在运行时提供排序条件 .

  • 1

    在TreeSet中使用比较器的关键是你没有编写代码来进行实际排序,你只需提供一种方法,根据比较规则确定哪个对象是第一个 . 如果您不想创建比较器,则需要添加实现Comparable接口的集合对象 . 要对ArrayList进行排序,请使用Collections.sort() .

相关问题