【问题标题】:Is there anyway to add metadata to Java Collections?是否有将元数据添加到 Java 集合?
【发布时间】:2011-01-25 16:19:15
【问题描述】:

假设我有一个对象集合,可以根据对象的不同字段使用许多不同的比较器对其进行排序。 如果能够稍后在代码中知道哪个比较器用于对集合进行排序以及它是升序还是降序,那就太好了。有没有办法优雅地做到这一点,而不是使用一堆布尔值来跟踪事情?

【问题讨论】:

    标签: java sorting collections metadata


    【解决方案1】:

    不,没有任何实现可以做到这一点。您需要自己跟踪它。您可以将 Collection 实现子类化以添加包含此信息的字段。

    您还可以根据需要使用 Map 将实现映射到元数据 - 特别是您似乎希望 IdentityHashMap 执行此操作,因为您希望比较两个不同的集合使用 equals() 将相等作为键。

    我会存储一个布尔值(升序/降序),以及对用于排序的比较器的引用,如果这完全决定了排序。或者,如果它是按字段排序的,则存储一个命名该字段的字符串。

    【讨论】:

    • 但是,您还希望键是弱的,因此当收集对象被收集时,映射条目将丢失。我投票支持 Google Collections 的弱键并发地图。
    【解决方案2】:

    不适用于 Collection 接口,但如果您使用 SortedSet,则有一个 compare() 方法,您可以在其中请求其比较器。

    否则,您将不得不对您正在使用的集合类进行子类化,以添加您需要的访问器。

    【讨论】:

    • 我的意思是一次只有一个比较器,但可以是任何基于不同领域的比较器。谢谢。
    【解决方案3】:

    确定:

    为您的装饰Collection<Foo>定义方法

    public List<Comparator<Foo>> getComparators() { ... }
    

    public int whichComparator() { ... }
    

    List 返回当前正在使用的Comparator。如果您要修改在对象的整个生命周期中可能使用的比较器,您可以使用Map 和一些明智的键(例如,枚举 - 甚至可能是实现比较器的枚举)让它变得更漂亮,但我认为以上是一个足够好的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2020-06-17
      相关资源
      最近更新 更多