【问题标题】:Java sorted collectionsJava 排序集合
【发布时间】:2018-06-20 05:46:55
【问题描述】:

有谁知道在我更新我的一个键属性的情况下是否可以保持 TreeMap 排序?

假设我的键按属性“a”排序,而 b 用于 equals():

class Key implements Comparable<Key> {
   int a;
   int b;
   // compareTo, equals end hashcode here
}

当添加键/值对时,它们将在 TreeMap 中排序,但是如果我更新其中一个键(属性 a),如何确保 TreeMap 将它们保持排序?

【问题讨论】:

  • 唯一安全的方法是删除该项目,进行更改并重新添加它。修改数据项中的键或哈希码会使基本的一致性合约失效。
  • @Dragonthoughts 你有一个很好的评论 - 请添加一个答案:)
  • @user8035311 完成,按要求完成 :)
  • 按一列“排序”并按另一列检查相等性可能是一个大问题,因为 TreeMap 和 HashMap 会表现出不同的行为。

标签: java


【解决方案1】:

唯一安全的方法是删除该项目,进行更改并重新添加它。修改数据项中的键或哈希码会使基本的一致性合约失效。

【讨论】:

    【解决方案2】:

    如果您依赖于值语义,那么不会。一般来说,如果它们的键发生突变,地图往往会发疯。 (TreeMap 通常会出现乱序,这可能会混淆键查找...如果 hashCode() 在键是键时没有返回一致的值,HashMap 可能会中断。)任何用作key 应该是不可变的,或者至少不被修改。

    如果要更新键,最好删除映射并将其重新插入到更改了值的新键下。

    【讨论】: