এটি আপনার প্রাথমিক প্রশ্নের কোনও উত্তর দেবে না (কারণ কেবলমাত্র মূল ডিজাইনারদেরই উত্তর রয়েছে), তবে আমি আপনাকে বিবেচনা করার জন্য একটি উপায় ছিল considering 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}