2012-12-26 8 views
6

हाय दिया मैं हैइस तरह एक नक्शे के मानचित्र में महत्वपूर्ण ढूँढना, मूल्य

[this:0, is:1, a:2, file:3, anotherkey:4, aa:5] 

मैं मैं key एक नक्शे के value दिया मिल सकता है चाहता हूँ। उदाहरण के लिए, यदि मान 5 दिया गया है तो मुझे मानचित्र से aa वापस करने की आवश्यकता है।

क्या यह संभव है?

उत्तर

1

आपको शायद entry set पर फिर से शुरू करना होगा और value से मिलान के साथ प्रविष्टि को खोजने का प्रयास करें।

12

मैं वहाँ किसी दिए गए मूल्य के लिए एक महत्वपूर्ण पाने के लिए एक सीधा तरीका है कि अगर पता नहीं है, लेकिन Map#find का उपयोग कर एक नक्शे के प्रवेश पाने के लिए और उसके बाद प्राप्त अपने मूल्य के लिए पर्याप्त होना चाहिए:

def keyForValue(map, value) { 
    map.find { it.value == value }?.key 
} 

def map = [a: 1, b: 2, c: 3] 
assert keyForValue(map, 2) == 'b' 
assert keyForValue(map, 42) == null 

सामान्य तौर पर, मानचित्रों को उनकी प्रविष्टियों के बीच ऑर्डर संबंध रखने की आवश्यकता नहीं है, लेकिन ग्रोवी के शाब्दिक मानचित्रों के लिए डिफ़ॉल्ट कार्यान्वयन LinkedHashMap है, जो आदेश दिया गया है, इसलिए keyForValue उन मानचित्रों का उपयोग करते समय हमेशा मूल्य के लिए पहली कुंजी उत्पन्न करेगा।

1
def expect = 5 
def m = ['this':0, is:1, a:2, file:3, aa:5] 
def r = m.collectMany{ k,v -> (v == expect) ? [k] : []} 

// Result: [aa] 
5

इसके लिए कोई विशिष्ट आदेश नहीं है।

def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5] 
def myValue = 5 

आप कर सकते हैं::

def myKey = myMap.find{ it.value == myValue }?.key 
// 'aa' 

आप सभी चाहते हैं

सौभाग्य से, के रूप में here से पता चला है, आप आसानी से एक नक्शे में एक विशिष्ट मूल्य के लिए कुंजी (रों) प्राप्त कर सकते हैं

def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5, bb:5] 
def myValue = 5 

def myKeys = [] 
myMap.findAll{ it.value == myValue }.each{myKeys << it?.key} 
// ['aa', 'bb'] 
2

आप मानचित्र को उलटने सकता है, इस तरह:: चाबियाँ, कुछ इस तरह करते हैं

Map m = [a: '1', b: '2'] 
Map mInvert = m.collectEntries { e -> [(e.value): e.key] } 

assert mInvert == ['1':'a', '2':'b'] 

assert mInvert['2'] == 'b' 
assert m['b'] == '2' 
+0

नहीं, आपका कोड दिलचस्प है :) लेकिन प्रदर्शन हत्यारा क्योंकि आप एक और मानचित्र फिर से बनाते हैं। नक्शा प्रविष्टि को मानने के लिए एक तरीका है, सही उत्तर महामारी द्वारा लंबे समय पहले दिया गया है: myMap.find {it.value == 5} .key – ARA

+0

@ARA वास्तव में बार-बार उपयोग के लिए crazy4groovy का समाधान तेजी से होगा जब तक उलटा संग्रह हर बार पुनर्निर्मित नहीं किया जाता है। जब आप O (logN) पर मानचित्र का उपयोग कर सकते हैं तो आपको एक सूची ओ (एन) पर पुनरावृत्ति नहीं करना चाहिए। बेशक, प्रदर्शन को वैसे भी पठनीयता के लिए बैक-सीट लेनी चाहिए - और यदि सही हो तो पागल 4groovy का समाधान शायद अधिक पठनीय है ... हालांकि यह बहुत "ग्रोवी" नहीं है :) –

+0

@ बिल: हाँ, मैंने जो कहा है प्रदर्शन हत्यारा हर बार नक्शे को फिर से बनाने के लिए है उदाहरण के लिए जो लम्बाडा का उपयोग फ्लाई पर फिर से बनाने के लिए करता है। बेशक यदि नक्शा प्रत्येक कॉल पर बनाए रखा नहीं जाता है और बनाए रखा जाता है, तो यह पुनरावृत्ति से बहुत तेज होगा। यह मानचित्र का उद्देश्य है। :) और मुझे लगता है कि मानचित्र ओ (1) ओ (लॉग (एन) नहीं कहा जाता है, एक btree ओ (लॉग (एन)) होगा? – ARA

संबंधित मुद्दे