是否仍有向Java集合添加元数据的方法?
假设我有一个对象集合,可以根据对象的不同字段,使用许多不同的比较器对其进行排序。是否仍有向Java集合添加元数据的方法?,java,sorting,collections,metadata,Java,Sorting,Collections,Metadata,假设我有一个对象集合,可以根据对象的不同字段,使用许多不同的比较器对其进行排序。 稍后在代码中能够知道使用哪个比较器对集合进行排序,以及它是升序还是降序,这将是很好的。还有什么方法可以优雅地完成这项工作,而不是使用一堆布尔值来跟踪事情吗?没有,没有任何实现可以做到这一点。你需要自己跟踪它。您可以对集合实现进行子类化,以添加包含此信息的字段 您还可以使用映射将实现映射到元数据,特别是您似乎希望IdentityHashMap这样做,因为您不希望将两个不同的集合作为键与equals()进行相等性比较
稍后在代码中能够知道使用哪个比较器对集合进行排序,以及它是升序还是降序,这将是很好的。还有什么方法可以优雅地完成这项工作,而不是使用一堆布尔值来跟踪事情吗?没有,没有任何实现可以做到这一点。你需要自己跟踪它。您可以对集合实现进行子类化,以添加包含此信息的字段 您还可以使用映射将实现映射到元数据,特别是您似乎希望IdentityHashMap这样做,因为您不希望将两个不同的集合作为键与equals()进行相等性比较
我将存储一个布尔值(升序/降序)和一个对用于排序的比较器的引用,如果这完全决定了排序的话。或者,如果它是按字段排序的,则可能存储一个命名该字段的字符串。不适用于收集接口,但如果您使用的是comparator()方法,您可以在其中请求其comparator 否则,您必须对用于添加所需访问器的集合类进行子类化。确定: 为您的
收藏定义方法
从列表中返回当前正在使用的比较器。如果要修改在对象生命周期中可能使用的比较器,可以使用映射和一些合理的键(例如,枚举-甚至可能是实现比较器的枚举),使其更为奇特,但我认为以上是一个足够好的开始。但是,您也希望键较弱,因此,当收集对象被收集时,映射条目将消失。我投票支持Google Collections的弱键并发地图。我的意思是一次只能有一个比较器,但可以是基于不同字段的任何比较器。谢谢
public List<Comparator<Foo>> getComparators() { ... }
public int whichComparator() { ... }