පේළි 1 ක පිළිතුරු තුනක් ...
මෙය සිදු කිරීම සඳහා මම ගූගල් එකතු ගුවා භාවිතා කරමි - ඔබේ අගයන් Comparable
නම් ඔබට භාවිතා කළ හැකිය
valueComparator = Ordering.natural().onResultOf(Functions.forMap(map))
එමඟින් සිතියම සඳහා ශ්රිතයක් (වස්තුවක්) නිර්මාණය කරනු ඇත [එය ඕනෑම යතුරක් ආදානය ලෙස ගෙන, අදාළ අගය ආපසු ලබා දෙයි], ඉන්පසු ඒවාට [අගයන්] සඳහා ස්වාභාවික (සංසන්දනාත්මක) ඇණවුමක් යොදනු ඇත.
ඒවා සැසඳිය නොහැකි නම්, එවිට ඔබට යමක් කළ යුතුය
valueComparator = Ordering.from(comparator).onResultOf(Functions.forMap(map))
මේවා TreeMap ( Ordering
විස්තාරණය වන පරිදි Comparator
) හෝ යම් වර්ග කිරීමකින් පසු LinkedHashMap වෙත යෙදිය හැකිය
සැ.යු : ඔබ TreeMap භාවිතා කිරීමට යන්නේ නම්, සංසන්දනය == 0 නම්, අයිතමය දැනටමත් ලැයිස්තුවේ ඇති බව මතක තබා ගන්න (ඔබට සමාන අගයන් කිහිපයක් සසඳන විට එය සිදුවනු ඇත). මෙය සමනය කිරීම සඳහා, ඔබට ඔබේ යතුර සංසන්දකයාට එකතු කළ හැකිය (ඔබේ යතුරු සහ අගයන් යැයි උපකල්පනය කරමින් Comparable
):
valueComparator = Ordering.natural().onResultOf(Functions.forMap(map)).compound(Ordering.natural())
= යතුර සිතියම් ගත කළ අගයට ස්වාභාවික අනුපිළිවෙල යොදන්න, සහ යතුරේ ස්වාභාවික අනුපිළිවෙල සමඟ සංයුක්ත කරන්න
ඔබගේ යතුරු 0 සංසන්දනය නම්, නමුත් මේ බොහෝ සඳහා ප්රමාණවත් විය යුතු මෙය තවමත් වැඩ නොකරන බව සටහන comparable
භාණ්ඩ (ලෙස hashCode
, equals
හා compareTo
සමපාත වේදැයි බොහෝවිට ...)
බලන්න Ordering.onResultOf () හා Functions.forMap () .
ක්රියාත්මක කිරීම
ඉතින් දැන් අපට අවශ්ය දේ කරන සංසන්දකයෙකු අප සතුව ඇති බැවින්, එයින් අපට ප්රති result ලයක් ලබා ගත යුතුය.
map = ImmutableSortedMap.copyOf(myOriginalMap, valueComparator);
දැන් මෙය බොහෝ දුරට වැඩ කරනු ඇත, නමුත්:
- සම්පූර්ණ නිමි සිතියමක් ලබා දිය යුතුය
- ඉහත සංසන්දකයන් උත්සාහ නොකරන්න
TreeMap
; ඇතුළත් කළ යතුරක් වටිනාකමක් නොමැති විට එය සංසන්දනය කිරීමට උත්සාහ කිරීමෙන් පලක් නැත, එනම්, එය වේගයෙන් කැඩී යයි
පොයින්ට් 1 මට ටිකක් ගනුදෙනු කරන්නෙක්; ගූගල් එකතු කිරීම ඇදහිය නොහැකි තරම් කම්මැලි ය (එය හොඳයි: ඔබට සෑම ක්රියාවක්ම ක්ෂණිකව කළ හැකිය; සැබෑ කාර්යය ඔබ ප්රති result ලය භාවිතා කිරීමට පටන් ගත් විට සිදු වේ), මේ සඳහා සම්පූර්ණ සිතියමක් පිටපත් කිරීම අවශ්ය වේ !
"සම්පූර්ණ" පිළිතුර / සාරධර්ම අනුව සජීවීව වර්ග කළ සිතියම
කෙසේ වෙතත් කරදර නොවන්න; "සජීවී" සිතියමක් මේ ආකාරයෙන් වර්ග කර තිබීම පිළිබඳව ඔබ දැඩි ලෙස උමතු වී ඇත්නම්, ඉහත ගැටළු වලින් එකක් පමණක් නොව (!) දෙකම පහත දැක්වෙන පිස්සු වැනි දේ සමඟ විසඳා ගත හැකිය:
සටහන: මෙය 2012 ජුනි මාසයේදී සැලකිය යුතු ලෙස වෙනස් වී ඇත - පෙර කේතය කිසි විටෙකත් ක්රියා කළ නොහැක: TreeMap.get()
-> compare()
සහ compare()
-> අතර අසීමිත පුඩුවක් නිර්මාණය නොකර අගයන් සොයා බැලීමට අභ්යන්තර හැෂ්මැප් අවශ්ය වේ.get()
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 ....
එය ඒ ආකාරයෙන්.