Java 地图的比较<;字符串,对象>;

Java 地图的比较<;字符串,对象>;,java,comparator,Java,Comparator,我有一个包含一组字段的类: class T { int timestamp; String name; } 使用基于这些字段自动生成的hashcode/equals/compareTo。 我需要添加另一个字段映射参数 为它实现hashCode/equals并不困难,但我有点被compareTo卡住了: 如果时间戳和名称相同,那么T类的两个实例的顺序并不重要,但我希望它满足compareTo约定(例如,不仅仅是“return1”) 我希望它与equals同步,所以我不能跳过compareTo中的

我有一个包含一组字段的类:

class T {
int timestamp;
String name;
}
使用基于这些字段自动生成的hashcode/equals/compareTo。 我需要添加另一个字段
映射参数
为它实现hashCode/equals并不困难,但我有点被compareTo卡住了:

  • 如果时间戳和名称相同,那么T类的两个实例的顺序并不重要,但我希望它满足compareTo约定(例如,不仅仅是“return1”)
  • 我希望它与equals同步,所以我不能跳过compareTo中的参数字段(在这种情况下,如果我们使用HashSet或TreeSet来存储项,结果可能会不同)
  • 因此,我不关心前两个字段是否相等的顺序,但希望避免出现2)中提到的奇怪问题
  • 如果equals比较整个地图,我无法为这个领域发明任何比较器来满足这些要求。也许我可以在equals和compareTo中使用类似于hashcode比较的东西,但对我来说它看起来很奇怪。
    这里有什么选项吗?

    可以先比较时间戳;如果相等,则比较名称,如果相等,则取按名称排序的参数键集,并进行比较?添加另一个代理项字段(纯粹用于比较)怎么样,类似于“位置”?另一方面,如果希望它与equals同步,则必须确保两个相等的“参数”的字段相同maps@JeremyGrand,在这种情况下,我们有具有相同键但不同值的映射compareTo将返回0,while equals是false。我认为如果您的类实现了
    Comparable
    ,并且您的
    equals
    依赖于未实现此功能的字段,则您将始终遇到此问题interface@dbf我不想花那么多时间在一个简单的评论上,你可以拿整个条目集,按字母键排序,然后对每个条目进行比较,先输入键,然后输入值。