У меня проблема с TreeMap
, для которого мы определили объект пользовательского ключа. Проблема в том, что после помещения нескольких объектов на карту и попытки извлечь с помощью того же ключа, который использовался для добавления на карту, я получаю нулевое значение. Я считаю, что это связано с тем, что у нас есть 2 точки данных на ключе. Одно значение всегда заполняется, а одно значение не всегда заполняется. Так что, похоже, проблема заключается в использовании compareTo
и equals
. К сожалению, бизнес-требования о том, как наши ключи определяют равенство, должны быть реализованы таким образом.
Я думаю, что это лучше всего иллюстрируется кодом.
public class Key implements Comparable<Key> {
private String sometimesPopulated;
private String alwaysPopulated;
public int compareTo(Key aKey){
if(this.equals(aKey)){
return 0;
}
if(StringUtils.isNotBlank(sometimesPopulated) && StringUtils.isNotBlank(aKey.getSometimesPopulated())){
return sometimesPopulated.compareTo(aKey.getSometimesPopulated());
}
if(StringUtils.isNotBlank(alwaysPopulated) && StringUtils.isNotBlank(aKey.getAlwaysPopulated())){
return alwaysPopulated.compareTo(aKey.getAlwaysPopulated());
}
return 1;
}
public boolean equals(Object aObject){
if (this == aObject) {
return true;
}
final Key aKey = (Key) aObject;
if(StringUtils.isNotBlank(sometimesPopulated) && StringUtils.isNotBlank(aKey.getSometimesPopulated())){
return sometimesPopulated.equals(aKey.getSometimesPopulated());
}
if(StringUtils.isNotBlank(alwaysPopulated) && StringUtils.isNotBlank(aKey.getAlwaysPopulated())){
return alwaysPopulated.equals(aKey.getAlwaysPopulated());
}
return false;
}
Таким образом, проблема возникает, когда вы пытаетесь получить значение с карты после размещения на ней каких-либо предметов.
Map<Key, String> map = new TreeMap<Key, String>();
Key aKey = new Key(null, "Hello");
map.put(aKey, "world");
//Put some more things on the map...
//they may have a value for sometimesPopulated or not
String value = map.get(aKey); // this = null
Так почему же значение пусто после того, как оно просто введено? Я думаю, что алгоритм, используемый TreeMap
, сортирует карту непоследовательным образом из-за того, что я использую compareTo
и equals
. Я открыт для предложений о том, как улучшить этот код. Спасибо