我正在尝试对键上的 TreeMap 进行排序。键是一些具有 int、List、String 等的自定义 DataStructure。我期望排序的成员有一些重复项。假设该成员是Rank。超过 1 个对象可以具有相同的等级。
简化版示例:
注意:在 CompareTo 方法中,不会有意返回 0 以不忽略重复项。(如果这不是避免重复项的正确方法,请纠正我)
import java.util.TreeMap;
public class TreeTest {
public static void main(String[] args) {
TreeMap<Custom,String> t = new TreeMap<Custom,String>();
Custom c1 = new Custom();
c1.setName("a");
c1.setRank(0);
Custom c2 = new Custom();
c2.setName("b");
c2.setRank(1);
Custom c3 = new Custom();
c3.setName("c");
c3.setRank(0);
t.put(c1, "first");
t.put(c2, "Second");
t.put(c3, "Third");
System.out.println(t.keySet());
for(Custom c:t.keySet()){
System.out.println(t.get(c));
}
}
}
和自定义对象
package com.example.ui;
public class Custom implements Comparable<Custom>{
int rank;
String name;
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + rank;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Custom other = (Custom) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (rank != other.rank)
return false;
return true;
}
// 0 is not returned intentionally to NOT ignore duplicates.
public int compareTo(Custom o) {
if(o.rank>this.rank)
return 1;
if(o.rank==this.rank)
return -1;
return -1;
}
}
输出::
[com.example.ui.Custom@fa0, com.example.ui.Custom@fbe, com.example.ui.Custom@f80] 空值 空值 空值
预期:分别基于排名 0、1、0 的第一、第二、第三。
我在谷歌上看了几个例子。它们中的大多数是使用具有原始数据类型的键或值进行 TreeMap 排序的基本用法,但当排序成员是自定义键 DataStructure 的一部分时,没有一个具有重复项。
请帮忙?