2012-12-28 74 views
6

से किसी भी कुंजी में खोजने के लिए कुशल तरीका है, मुझे यह जांचने की आवश्यकता है कि मानचित्र में सूची में से कोई भी कुंजी है या नहीं, और यदि यह पहले मिलान मान को वापस कर देता है। अनुभवहीन दृष्टिकोण है कि मन में आता है दो नेस्टेड छोरों में यह करने के लिए है:मानचित्र में किसी भी कुंजी/इटेरबल

Map<String, String> fields = new HashMap<String, String>(); 
fields.put("a", "value a"); 
fields.put("z", "value z"); 
String[] candidates = "a|b|c|d".split("|"); 
for (String key : fields.keySet()){ 
    for (String candidate : candidates) { 
     if (key.equals(candidate)){ 
      return fields.get(key); 
     } 
    } 
} 

वहाँ एक अच्छे और अधिक कारगर तरीका एक जावा मानक पुस्तकालय पर निर्भर है, संभवतः?

उत्तर

19

निश्चित रूप से कुछ की तरह:

for (String candidate : candidates) { 
    String result = fields.get(key); 
    if (result != null) { 
     return result; 
    } 
} 

ऊपर केवल उम्मीदवार कुंजी प्रति एक नक्शा देखने प्रदर्शन करती है। यह उपस्थिति और निष्कर्षण के लिए अलग परीक्षण से बचाता है, क्योंकि एक अस्तित्वहीन कुंजी निकालने से आपको बस एक शून्य मिल जाएगी। नोट (धन्यवाद स्लेनेक) कि वैध समाधान के लिए शून्य मान इस समाधान के लिए एक अस्तित्वहीन कुंजी से अलग नहीं है।

मुझे समझ में नहीं आता कि आप केस रूपांतरण क्यों कर रहे हैं, बीटीडब्ल्यू।

+8

इस के रूप में कुशल के रूप में यह मिल सकता है इसके बाद के संस्करण जवाब है, लेकिन यह 'मुश्किल' हो सकता है अगर 'शून्य '' Map' में अनुमत मान है। –

+3

दिलचस्प ... क्या मैं इसे सही ढंग से समझता हूं कि विचार केवल 'मानचित्र का उपयोग करना है।'map.contains() + map.get() 'के बजाय एक बार प्राप्त करें) क्योंकि यह दूसरी लुकअप से बच जाएगा? काफी अच्छा है! – ccpizza

+3

@NimChimpsky retain सभी अवरोधक है। –

20
for(String candidate : candidates) { 
if(fields.containsKey(candidate)) { 
    return fields.get(candidate) 
} 
} 

सबसे अच्छा तरीका अगर शून्य मान संभवतः मानचित्र में हैं, और यदि केवल पहली बार पता लगाया गया कुंजी आवश्यक है।

7

मेरे ले:

Map<String, String> fields = new HashMap<String, String>(); 
fields.put("a", "value a"); 
fields.put("z", "value z"); 
String[] candidates = "a|b|c|d".split("|"); 
for (String candidate : candidates) { 
    if (fields.containsKey(candidate)) { 
     return fields.get(candidate); 
    } 
} 
1
Map<String, String> fields = new HashMap<String, String>(); 
fields.put("a", "value a"); 
fields.put("z", "value z"); 
String[] candidates = "a|b|c|d".split("|"); 
List<String> canList = Arrays.asList(candidates); 
for (String key : fields.keySet()){ 

if (canList .contains(key)) { 
return fields.get(key); 
} 

} 
+1

** नोट **: canList.contains समय में रैखिक है। – Srinivas

2

कोशिश के रूप में

List list= Arrays.asList(1, 2, 3); 
    HashMap map = new HashMap(); 
    map.put(1, 1); 
    map.put(3, 3); 
    Set set = new HashSet(map.keySet()); 
    set.retainAll(list); 
    System.out.println(set); 
    Object e = set.isEmpty() ? null : set.iterator().next(); 
    System.out.println(e); 

उत्पादन

[1, 3] 
1 
5

Set<String> keySet = new HashSet<String>(fields.keySet());  
keySet.retainAll(list); 

तो keySet HashMap से सभी चाबियाँ जो सूची में उल्लेख कर रहे है करने के लिए माना जाता है की कोशिश करो

+०१२३५१६४१०
+2

यह मेरा मानना ​​है कि सबसे छोटा रास्ता है। हालांकि, यह सबसे तेज़ नहीं हो सकता है क्योंकि लूपिंग पहले पाए गए परिणाम पर समाप्त होता है, लेकिन यह अंत तक अपना काम जारी रखता है। –

+3

@ स्लेनेक, हाँ यह निर्भर करता है कि क्या ओपी सभी चाबियाँ प्राप्त करना चाहता है या सिर्फ पहला। –

1

यदि आप मानते हैं कि मानचित्र की कुंजी पहले से ही कम मामले में है, तो आप एक लूप का उपयोग कर सकते हैं, वैसे ही आप मानते हैं कि लुकअप मान कम मामले में हैं।

4

जावा 8 में आप इस का उपयोग कर सकते हैं:

return candidates.stream() 
      .filter(fields::containsKey) 
      .findFirst() 
      .map(fields::get) 
      .orElse(null); 
5

जावा 8 में आप इस हो सकता है:

boolean exists = Arrays.stream(candidates).anyMatch(fields::containsKey); 

तुम सिर्फ अगर उम्मीदवारों की किसी भी नक्शे के लिए महत्वपूर्ण है जानना चाहते हैं।

आप पहली बार में जानना चाहते हैं या किसी का उपयोग कर सकते हैं:

Arrays.stream(candidates).filter(fields::containsKey).findAny(); 

या

Arrays.stream(candidates).filter(fields::containsKey).findFirst(); 

प्रति @ Klapsa2503 रूप