Я пытаюсь отсортировать TreeMap по ключу. Ключ - это некоторая пользовательская DataStructure, имеющая int, List, String и т. Д.
Член, на котором я ожидаю сортировку, имеет несколько дубликатов. Допустим, этот участник - Ранг. Более 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]
null
null
null
Ожидаемое:
Первый, Второй, Третий на основании Ранга 0,1,0 соответственно.
Я посмотрел пару примеров в Google. Большинство из них были базовыми для сортировки TreeMap с использованием ключей или значений с примитивными типами данных, но ни один с дубликатами при сортировке члена
является частью пользовательского ключа DataStructure.
Пожалуйста, помогите?