তিনটি 1-লাইনের উত্তর ...
আমি এটি করতে গুগল কালেকশন পেয়ারা ব্যবহার করব - যদি আপনার মান হয় Comparable
তবে আপনি এটি ব্যবহার করতে পারেন
valueComparator = Ordering.natural().onResultOf(Functions.forMap(map))
যা মানচিত্রের জন্য একটি ফাংশন (অবজেক্ট) তৈরি করবে [যা কোনও কীটি ইনপুট হিসাবে গ্রহণ করে, সংশ্লিষ্ট মানটি ফিরিয়ে দেবে] এবং তারপরে তাদেরকে [মানগুলি] অর্ডার করে প্রাকৃতিক (তুলনীয়) প্রয়োগ করবে।
যদি সেগুলি তুলনামূলক না হয়, তবে আপনার লাইনের সাথে কিছু করা দরকার
valueComparator = Ordering.from(comparator).onResultOf(Functions.forMap(map))
এগুলি একটি ট্রি ম্যাপ ( Ordering
প্রসারিত হিসাবে Comparator
) বা কিছু বাছাইয়ের পরে লিংকডহ্যাশম্যাপে প্রয়োগ করা যেতে পারে
বিশেষ দ্রষ্টব্য : যদি আপনি TreeMap ব্যবহার করতে যাচ্ছি, তাহলে মনে রাখবেন যে যদি একটি তুলনা == 0, তারপর আইটেমটি ইতিমধ্যে তালিকা (যা আপনি যে একই তুলনা একাধিক মান আছে ঘটবে) রয়েছে। এটিকে হ্রাস করতে, আপনি আপনার কীটি তুলকের তুলনায় এমনভাবে যুক্ত করতে পারেন (ধরে নেওয়া যে আপনার কী এবং মানগুলি Comparable
):
valueComparator = Ordering.natural().onResultOf(Functions.forMap(map)).compound(Ordering.natural())
= কী দ্বারা মানচিত মানটিতে প্রাকৃতিক ক্রম প্রয়োগ করুন এবং কীটির প্রাকৃতিক অর্ডিংয়ের সাথে মিশ্রণ করুন
লক্ষ্য করুন এই এখনও যদি আপনার কী-0 তুলনা, কিন্তু এই সবচেয়ে জন্য যথেষ্ট হওয়া উচিত কাজ করবে না comparable
আইটেম (যেমন hashCode
, equals
এবং compareTo
সুসংগত প্রায়ই ...)
দেখুন Ordering.onResultOf () এবং Functions.forMap () ।
বাস্তবায়ন
সুতরাং এখন আমরা একটি তুলনাকারী পেয়েছি যা আমরা যা করতে চাই তা করে, আমাদের এটি থেকে ফলাফল নেওয়া দরকার।
map = ImmutableSortedMap.copyOf(myOriginalMap, valueComparator);
এখন এটি সম্ভবত কাজ করবে তবে:
- একটি সম্পূর্ণ সমাপ্ত মানচিত্র দেওয়া প্রয়োজন
- উপরের তুলনামূলকগুলিকে একটিতে চেষ্টা করবেন না
TreeMap
; কোনও keyোকানো কীটির সাথে তুলনা করার চেষ্টা করার কোনও মানে নেই যখন পুটের পরে এটির কোনও মূল্য নেই, অর্থাত্ এটি সত্যই দ্রুত ভেঙে যাবে
পয়েন্ট 1 আমার জন্য কিছুটা চুক্তি-বিভক্তকারী; গুগল সংগ্রহগুলি অবিশ্বাস্যরূপে অলস (যা ভাল: আপনি তাত্ক্ষণিকভাবে প্রতিটি অপারেশন করতে পারেন; ফলাফলটি ব্যবহার শুরু করার সাথে আসল কাজটি সম্পন্ন করা হয়) এবং এর জন্য পুরো মানচিত্রটি অনুলিপি করা দরকার !
"পূর্ণ" উত্তর / মান অনুসারে লাইভ বাছাই করা মানচিত্র
যদিও চিন্তা করবেন না; যদি আপনি "লাইভ" মানচিত্রটি এইভাবে সাজানো নিয়ে যথেষ্ট ক্ষুধার্ত হয়ে থাকেন তবে নীচের মতো উন্মাদ কিছু দিয়ে আপনি উপরের বিষয়গুলির একটি ছাড়া উভয় (!) সমাধান করতে পারেন:
দ্রষ্টব্য: এটি ২০১২ সালের জুনে উল্লেখযোগ্যভাবে পরিবর্তিত হয়েছে - আগের কোডটি কখনই কাজ করতে পারে না: TreeMap.get()
-> compare()
এবং compare()
-> এর মধ্যে অসীম লুপ তৈরি না করে মানগুলি অনুসন্ধান করার জন্য একটি অভ্যন্তরীণ হ্যাশম্যাপ প্রয়োজন isget()
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import com.google.common.base.Functions;
import com.google.common.collect.Ordering;
class ValueComparableMap<K extends Comparable<K>,V> extends TreeMap<K,V> {
//A map for doing lookups on the keys for comparison so we don't get infinite loops
private final Map<K, V> valueMap;
ValueComparableMap(final Ordering<? super V> partialValueOrdering) {
this(partialValueOrdering, new HashMap<K,V>());
}
private ValueComparableMap(Ordering<? super V> partialValueOrdering,
HashMap<K, V> valueMap) {
super(partialValueOrdering //Apply the value ordering
.onResultOf(Functions.forMap(valueMap)) //On the result of getting the value for the key from the map
.compound(Ordering.natural())); //as well as ensuring that the keys don't get clobbered
this.valueMap = valueMap;
}
public V put(K k, V v) {
if (valueMap.containsKey(k)){
//remove the key in the sorted set before adding the key again
remove(k);
}
valueMap.put(k,v); //To get "real" unsorted values for the comparator
return super.put(k, v); //Put it in value order
}
public static void main(String[] args){
TreeMap<String, Integer> map = new ValueComparableMap<String, Integer>(Ordering.natural());
map.put("a", 5);
map.put("b", 1);
map.put("c", 3);
assertEquals("b",map.firstKey());
assertEquals("a",map.lastKey());
map.put("d",0);
assertEquals("d",map.firstKey());
//ensure it's still a map (by overwriting a key, but with a new value)
map.put("d", 2);
assertEquals("b", map.firstKey());
//Ensure multiple values do not clobber keys
map.put("e", 2);
assertEquals(5, map.size());
assertEquals(2, (int) map.get("e"));
assertEquals(2, (int) map.get("d"));
}
}
যখন আমরা রাখি, আমরা নিশ্চিত করি যে হ্যাশ মানচিত্রে তুলকের জন্য মান রয়েছে এবং তার পরে বাছাইয়ের জন্য ট্রিসেটে রেখেছি। তবে এর আগে আমরা হ্যাশ ম্যাপটি পরীক্ষা করে দেখি যে কীটি আসলে কোনও সদৃশ নয়। এছাড়াও, আমরা যে তুলনামূলকটি তৈরি করি তা কীটিও অন্তর্ভুক্ত করবে যাতে সদৃশ মানগুলি নন-সদৃশ কীগুলি (== তুলনার কারণে) মুছবে না। এই 2 টি আইটেম মানচিত্র চুক্তি রাখা নিশ্চিত করার জন্য অতীব গুরুত্বপূর্ণ ; যদি আপনি ভাবেন যে আপনি এটি চান না, তবে আপনি প্রায় পুরোপুরি মানচিত্রে (পরিবর্তিত Map<V,K>
) ফিরতে চলেছেন )
কনস্ট্রাক্টর হিসাবে হিসাবে কল করা প্রয়োজন
new ValueComparableMap(Ordering.natural());
//or
new ValueComparableMap(Ordering.from(comparator));
List<Map.Entry<...>> list =new LinkedList(map.entrySet())
এবংCollections.sort ....
এটি সেভাবে ব্যবহার করুন।