有没有向Java Collections添加元数据?

时间:2010-03-09 23:09:07

标签: java sorting collections metadata

假设我有一组对象,可以根据对象的不同字段使用多个不同的比较器进行排序。 能够在后面的代码中知道哪个比较器用于对Collection进行排序以及它是升序还是降序,这将是很好的。无论如何,这样做是否优雅,而不是使用一群布尔人来追踪事物?

3 个答案:

答案 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以及一些合理的键(例如,枚举 - 甚至是实现比较器的枚举)来制作它,如果你正在修改可能在对象的生命周期中使用哪些比较器,但我认为以上是一个很好的开始。