我知道java中的 TreeSet
会按升序自动对其元素进行排序,以保证顺序 .
例如,如果我有一个 Date
对象的数组随机,我将其复制到 TreeSet
然后它将以 TreeSet
以排序方式添加 .
但是假设不是一个简单的 Date
对象,我的 ArrayList
是 HashMap<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
分类数据有什么意义呢?
如何在不使用 TreeSet
中 Comparator
的新实例的情况下,根据 date
值对 ArrayList
ArrayList
进行排序?
4 回答
因为它是
TreeSet
代码,使它保持排序 . 您没有必须提供任何代码 - 您必须提供的是自定义比较 .你不能,直接 . 你可以写一个
HashMap
的子类,它自己实现了Comparable
,但这对我来说似乎有些奇怪 . 例如:然后你可以有一个
ArrayList<SpecialMap>
然后排序 .但鉴于你必须提供与比较器基本相同的代码并将你的比较与 Map 类型绑定,我觉得最好只坚持使用比较器 .
如果你没有向
TreeSet
提供Comparator
,那么它将依赖它的元素Comparable
来对它们进行排序 . 如果它们不是Comparable
,则会产生ClassCastException
. TreeSet javadocs解释:但
HashMap
类不是Comparable
,因此您必须提供自定义Comparator
,以便TreeSet
知道您要如何对它们进行排序 . 如果没有Comparator
,您无法对HashMap
进行排序,无论它们是在TreeSet
还是其他任何集合中 .在这种情况下使用
TreeSet
是有好处的 . 添加,查找和删除操作是O(log n) . 如果您为此使用ArrayList
,则添加和删除操作将为O(n),即使查找操作仍为O(log n) .更多来自
TreeSet
javadocs:您可以创建一个包含mydate,mystring,mystring2并实现Comparable接口的类,而不是使用HashMap .
但是,使用比较器是一种很好的做法,因为您将能够在运行时提供排序条件 .
在TreeSet中使用比较器的关键是你没有编写代码来进行实际排序,你只需提供一种方法,根据比较规则确定哪个对象是第一个 . 如果您不想创建比较器,则需要添加实现Comparable接口的集合对象 . 要对ArrayList进行排序,请使用Collections.sort() .