यह आपके प्राथमिक प्रश्न का उत्तर नहीं देगा (क्योंकि केवल मूल डिजाइनरों के पास इसका उत्तर है), लेकिन एक दृष्टिकोण जो मैं आप पर विचार कर रहा था, वह आपको खुद को लागू करने के लिए था। के SortedMap
आधार पर एक कार्यान्वयन करने की कोशिश करते हुए EnumMap
, मैं निम्नलिखित वर्ग के साथ आया।
यह निश्चित रूप से एक त्वरित और गंदा कार्यान्वयन है (और ध्यान दें कि यह पूरी तरह से अनुपालन नहीं है SortedMap
- क्योंकि दृश्य आवश्यकताओं को पूरा नहीं किया गया है), लेकिन अगर आपको एक की आवश्यकता है, तो आप इसे सुधार सकते हैं:
class SortedEnumMap<K extends Enum<K>, V>
extends EnumMap<K, V>
implements SortedMap<K, V> {
private Class<K> enumClass;
private K[] values;
public SortedEnumMap(Class<K> keyType) {
super(keyType);
this.values = keyType.getEnumConstants();
this.enumClass = keyType;
if (this.values.length == 0) {
throw new IllegalArgumentException("Empty values");
}
}
@Override
public Comparator<? super K> comparator() {
return Comparator.comparingInt(K::ordinal);
}
@Override
public SortedMap<K, V> subMap(K fromKey, K toKey) {
List<K> keys = Arrays.stream(this.values)
.dropWhile(k -> k.ordinal() < fromKey.ordinal())
.takeWhile(k -> k.ordinal() < toKey.ordinal())
.collect(Collectors.toList());
return this.forKeys(keys);
}
@Override
public SortedMap<K, V> headMap(K toKey) {
List<K> keys = new ArrayList<>();
for (K k : this.values) {
if (k.ordinal() < toKey.ordinal()) {
keys.add(k);
} else {
break;
}
}
return this.forKeys(keys);
}
@Override
public SortedMap<K, V> tailMap(K fromKey) {
List<K> keys = new ArrayList<>();
for (K k : this.values) {
if (k.ordinal() >= fromKey.ordinal()) {
keys.add(k);
}
}
return this.forKeys(keys);
}
//Returned map is NOT a "view" or the current one
private SortedEnumMap<K, V> forKeys(List<K> keys) {
SortedEnumMap<K, V> n = new SortedEnumMap<>(this.enumClass);
keys.forEach(key -> n.put(key, super.get(key)));
return n;
}
@Override
public K firstKey() {
return this.values[0];
}
@Override
public K lastKey() {
return this.values[this.values.length - 1];
}
}
और एक त्वरित परीक्षण के लिए (बग अभी तक पाया जाना है):
SortedMap<Month, Integer> m = new SortedEnumMap(Month.class);
for (Month v : Month.values()) {
m.put(v, v.getValue());
}
System.out.println("firstKey(): " + m.firstKey());
System.out.println("lastKey(): " + m.lastKey());
System.out.println("headMap/June: " + m.headMap(Month.JUNE));
System.out.println("tailMap/June: " + m.tailMap(Month.JUNE));
System.out.println("subMap/April-July " + m.subMap(Month.APRIL, Month.JULY));
मुझे मिला:
firstKey(): JANUARY
lastKey(): DECEMBER
headMap/June: {JANUARY=1, FEBRUARY=2, MARCH=3, APRIL=4, MAY=5}
tailMap/June: {JUNE=6, JULY=7, AUGUST=8, SEPTEMBER=9, OCTOBER=10, NOVEMBER=11, DECEMBER=12}
subMap/April-July {APRIL=4, MAY=5, JUNE=6}