假设我有一组对象,可以根据对象的不同字段使用多个不同的比较器进行排序。 能够在后面的代码中知道哪个比较器用于对Collection进行排序以及它是升序还是降序,这将是很好的。无论如何,这样做是否优雅,而不是使用一群布尔人来追踪事物?
答案 0 :(得分:2)
不适用于Collection接口,但是如果使用SortedSet,则可以使用compare()方法来请求其比较器。
否则,您必须继承您正在使用的集合类,以添加所需的访问器。
答案 1 :(得分:1)
没有与这样做的实现没有任何关系。您需要自己跟踪它。您可以将Collection实现子类化,以添加包含此信息的字段。
您也可以使用Map将实现映射到元数据 - 特别是您希望IdentityHashMap执行此操作,因为您不希望比较两个不同的集合使用equals()作为键的相等性。
我会存储一个布尔值(升序/降序),以及对用于排序的比较器的引用,如果这是完全确定排序的那个。或者,如果它在字段上排序,则存储一个字符串,或者命名该字段。
答案 2 :(得分:0)
确定:
为装饰Collection<Foo>
public List<Comparator<Foo>> getComparators() { ... }
和
public int whichComparator() { ... }
返回Comparator
当前正在使用的List
。你可以使用Map
以及一些合理的键(例如,枚举 - 甚至是实现比较器的枚举)来制作它,如果你正在修改可能在对象的生命周期中使用哪些比较器,但我认为以上是一个很好的开始。