【发布时间】:2011-01-25 16:19:15
【问题描述】:
假设我有一个对象集合,可以根据对象的不同字段使用许多不同的比较器对其进行排序。 如果能够稍后在代码中知道哪个比较器用于对集合进行排序以及它是升序还是降序,那就太好了。有没有办法优雅地做到这一点,而不是使用一堆布尔值来跟踪事情?
【问题讨论】:
标签: java sorting collections metadata
假设我有一个对象集合,可以根据对象的不同字段使用许多不同的比较器对其进行排序。 如果能够稍后在代码中知道哪个比较器用于对集合进行排序以及它是升序还是降序,那就太好了。有没有办法优雅地做到这一点,而不是使用一堆布尔值来跟踪事情?
【问题讨论】:
标签: java sorting collections metadata
不,没有任何实现可以做到这一点。您需要自己跟踪它。您可以将 Collection 实现子类化以添加包含此信息的字段。
您还可以根据需要使用 Map 将实现映射到元数据 - 特别是您似乎希望 IdentityHashMap 执行此操作,因为您不希望比较两个不同的集合使用 equals() 将相等作为键。
我会存储一个布尔值(升序/降序),以及对用于排序的比较器的引用,如果这完全决定了排序。或者,如果它是按字段排序的,则存储一个命名该字段的字符串。
【讨论】:
不适用于 Collection 接口,但如果您使用 SortedSet,则有一个 compare() 方法,您可以在其中请求其比较器。
否则,您将不得不对您正在使用的集合类进行子类化,以添加您需要的访问器。
【讨论】:
确定:
为您的装饰Collection<Foo>定义方法
public List<Comparator<Foo>> getComparators() { ... }
和
public int whichComparator() { ... }
从List 返回当前正在使用的Comparator。如果您要修改在对象的整个生命周期中可能使用的比较器,您可以使用Map 和一些明智的键(例如,枚举 - 甚至可能是实现比较器的枚举)让它变得更漂亮,但我认为以上是一个足够好的开始。
【讨论】: