2010-08-19 8 views
19

मान लीजिए मैं जावा में एक नक्शा जो इस तरह दिखता है:जावा में एक सीमा के भीतर चाबी के लिए मान जाओ

{ 
39:"39 to 41", 
41:"41 to 43", 
43:"43 to 45", 
45:">=45" 
} 

कुंजी क्रमबद्ध क्रम में हैं, तो (या तो ट्री-मैप या LinkedHashMap उपयोग करते हुए) अब अगर मैं कोशिश एक मान प्राप्त करने के लिए जो = = 39 और < 41 है। तब मुझे स्ट्रिंग "39 से 41" मिलनी चाहिए। मैं इसे कुशलतापूर्वक कैसे करूं?

+0

आपका मतलब है <<= 41' मुझे लगता है। लेकिन क्या आप हमेशा '39,41,43,45' देखेंगे या यदि आप' 40,42,50' के साथ प्रयास करते हैं तो क्या यह काम करना चाहिए? और क्या हमेशा बीच में केवल एक है? –

+0

[डेटा संरचनाएं जो किसी मान के लिए चाबियों की एक श्रृंखला को मैप कर सकती हैं] का संभावित डुप्लिकेट [https://stackoverflow.com/questions/13399821/data- संरचनाएं- थैट-can-map-a-range-of-keys-to -ए-वैल्यू) – Vadzim

उत्तर

52

ऐसा लगता है कि आप SortedMap से अधिक चाहते हैं; आप NavigableMap चाहते हैं! विशेष रूप से आप floorKey ऑपरेशन का उपयोग कर सकते हैं।

NavigableMap<Integer,String> map = 
     new TreeMap<Integer, String>(); 

    map.put(0, "Kid"); 
    map.put(11, "Teens"); 
    map.put(20, "Twenties"); 
    map.put(30, "Thirties"); 
    map.put(40, "Forties"); 
    map.put(50, "Senior"); 
    map.put(100, "OMG OMG OMG!"); 

    System.out.println(map.get(map.floorKey(13)));  // Teens 
    System.out.println(map.get(map.floorKey(29)));  // Twenties 
    System.out.println(map.get(map.floorKey(30)));  // Thirties 
    System.out.println(map.floorEntry(42).getValue()); // Forties 
    System.out.println(map.get(map.floorKey(666))); // OMG OMG OMG! 

नोट ceilingKey, lowerKey, higherKey, और भी …Entry…Key के बजाय कार्यों के साथ जो एक Map.Entry<K,V> के बजाय सिर्फ K रिटर्न भी देखते हैं कि:

यहाँ एक उदाहरण है।

+2

मुझे यह नहीं पता था, और स्पष्ट रूप से यहां कोई भी नहीं था। बहुत ही शांत! –

+3

सभी मानक रनटाइम जय हो! –

+1

कभी-कभी मुझे लगता है कि मुझे जावा पता है, और फिर मैं इस तरह कुछ चलाता हूं और मेरा दिमाग उड़ा दिया जाता है। – Jyro117

0

मुझे यकीन नहीं है कि यह आसान होगा। एक सुझाव "अंतराल को भरना" होगा, यानी 40->"39 to 41" इत्यादि मान दें। मुझे लगता है कि यदि आप मानचित्र में संभव संख्याओं की पूरी श्रृंखला को जानते हैं तो केवल तभी संभव होगा।

या मैबाबे कुछ ऐसा है जो get को ओवरराइड करता है ताकि यह देखने के लिए कि क्या नक्शा मानचित्र में है, और इसे तब तक विस्तारित किया जा रहा है जब तक कि उसे कुछ न मिल जाए। मुझे यकीन नहीं है कि यह अपने वर्तमान अनुमान में संभव होगा, क्योंकि आपको मूल्य तारों को पार्स करना होगा।

0

आप निम्न सीमा के लिए रिकर्सिव रूप से देख सकते हैं।

public String descriptionFor(int value) { 
    String description = map.get(value); 
    return description == null ? descriptionFor(value--) : description; 
} 

आपको न्यूनतम सीमा की आवश्यकता होगी।

1
एक क्रमबद्ध मानचित्र के साथ

, आप ऐसा ही कुछ कर सकता है:

SortedMap<Integer,String> head = map.headMap(value+1); 
if (head.isEmpty()) { 
    return null; 
} else { 
    return head.get(head.lastKey()); 
} 
0

आप इस तरह के एक नक्शे के अपने आप को लागू करने के लिए होगा, मेरा मानना ​​है कि। आप सही हैं कि इसे हल करना होगा; get के कार्यान्वयन को चाबियों के माध्यम से फिर से शुरू करना होगा जब तक कि यह सबसे बड़ी कुंजी न हो जो तर्क से कम या बराबर हो।

यदि आप TreeMap उपclass करते हैं तो यह शुरू में दिखाई देगा कि आप get() विधि को ओवरराइड करके यह काम कर सकते हैं। हालांकि, जितना संभव हो उतना नक्शा अनुबंध बनाए रखने के लिए आपको स्थिरता के लिए अन्य तरीकों को ओवरराइड करना होगा।

और उदा। containsKey()? क्या आपके मुख्य में 40 के लिए मैपिंग है? यदि आप false वापस करते हैं, तो कोई ग्राहक इस जानकारी के आधार पर get() पर कॉल न करने का निर्णय ले सकता है; इन कारणों (और औपचारिक परिभाषा) के लिए आपको true वापस करना होगा। लेकिन फिर यह निर्धारित करना मुश्किल बनाता है कि नक्शा "वास्तव में" एक दिया मैपिंग है या नहीं; यदि आप पहले से मौजूद कुछ भी ओवरराइट किए बिना अपडेट जैसे कुछ करना चाहते हैं।

remove() विधि भी मुश्किल हो सकती है। इंटरफेस के अपने पढ़ने,

// Calling map.remove "Removes the mapping for a key from this map if it is present." 
map.remove(x); 

// Now that the mapping is removed, I believe the following must hold 
assert map.get(x) == null; 
assert map.containsKey(x); 

लगातार यहां अभिनय से बहुत मुश्किल हो जाएगा। उदाहरण के लिए यदि आपके पास 35-40 से मैपिंग है, और आप remove(38) पर कॉल करते हैं, तो जैसा कि मैं समझता हूं कि आपको null को किसी भी बाद के 38 के लिए प्राप्त करने के लिए वापस करना होगा, लेकिन 35-37 या 39 के लिए उपरोक्त मैपिंग वापस करना होगा -40।


इसलिए जब आप ट्री-मैप अधिभावी द्वारा इस पर एक शुरुआत कर सकते हैं, शायद Map की पूरी अवधारणा तुम यहाँ काफी क्या चाहते हैं नहीं है। जब तक आपको Map लेने वाले मौजूदा तरीकों में स्लॉट करने के लिए इस व्यवहार की आवश्यकता नहीं है, तो इसे एक मानचित्र, जिस तरह से आप इसे परिभाषित कर रहे हैं, के रूप में इसे स्वयं को एक विशिष्ट वर्ग के रूप में बनाना आसान हो सकता है।

7

जावा 6 java.util.NavigableMap आज़माएं। http://download.oracle.com/javase/6/docs/api/java/util/NavigableMap.html

विशेष उपयोग में floorKey/floorEntry

उदाहरण के द्वारा: floorKey(40)39 वापस करना चाहिए। floorEntry उस मूल्य को वापस कर देगा जो आप खोज रहे हैं।

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