2009-06-29 38 views
5

मेरे पास एक स्ट्रीमिंग इनपुट है जिसने मूल्यों को दोहराया है। मैं किसी भी डेटा संरचना का उपयोग कर सकता हूं लेकिन मुझे प्रत्येक तत्व के अवसर की संख्या गिननी है। मान लीजिए मैं निम्नलिखित की तरह मोबाइल फोन के आपूर्तिकर्ताओं की एक सूची है:सूची में प्रत्येक आइटम की घटनाओं की संख्या की गणना

 
Apple 
Nokia 
Samsung 
Apple 
LG 
Nokia 
HTC 
Android 
Apple 
Nokia 
Nokia 
Apple 
Samsung 

मैं की तरह

 
Apple,4 
Nokia,4 
Samsung,2 
LG,1 
Android,1 

विवरण के साथ एक नक्शा अधिमानतः किसी भी डेटा संरचना के निर्माण के लिए मुझे यकीन है कि क्या यह इष्टतम है नहीं कर रहा हूँ है। क्या इससे बेहतर समाधान है?
असल में मैंने उपर्युक्त कोड को कोड के रूप में अभी तक लिखना नहीं है। तो बेहतर कोड भी मदद करेगा।

+0

"सूची आइटम की गिनती" लगता है भ्रामक – Tom

उत्तर

5

हां, मैं Map<String, Integer> का उपयोग करूंगा। मैं कुछ इस तरह में add लपेट होगा:

private static void incrementValue(Map<String, Integer> counters, String toAdd) { 
    Integer currValue = counters.get(toAdd); 
    if (currValue == null) 
     counters.put(toAdd, 1); 
    else 
     counters.put(toAdd, currValue+1); 
} 

या जेनरिक के बिना:

private static void incrementValue(Map counters, String toAdd) { 
    Integer currValue = (Integer) counters.get(toAdd); 
    if (currValue == null) 
     counters.put(toAdd, 1); 
    else 
     counters.put(toAdd, currValue+1); 
} 
+0

एक छोटा सा जानकारी से ... मैं जेनेरिक्स उपयोग नहीं कर सकते के रूप में मैं जावा का उपयोग करने के 1.4 – Harish

+0

यह काम करता है और कहा कि – Harish

1

डेटा कहां से आ रहा है? यदि एक डीबी - आप समूह के साथ बैकएंड पर पूछताछ में यह बहुत आसानी से कर सकते हैं।

+0

नहीं इसकी एक फ्लैट फ़ाइल – Harish

0

एक नक्शा जाने का रास्ता लगता है। प्रत्यक्ष पहुंच :)

कुंजी: तत्व मूल्य: ocurrences की संख्या, या सूची में तत्व के अनुक्रमण के साथ एक सूची।

0

मेरे दिमाग में आने वाली पहली चीज़ों को पोस्ट करने के बाद एक कोड "कोड - वैल्यू" बनाना और कोड का उपयोग करके सूची को एन्कोड करना है। यह बहुत ही अंतरिक्ष कुशल होगा।

0

इसके लिए सबसे प्राकृतिक संरचना एक बैग उर्फ ​​एक मल्टीसेट है।

एक बैग अनिवार्य रूप से ऑब्जेक्ट से गणना करने का एक कार्य है।

Google संग्रह में एक मल्टीसेट है हालांकि आप आसानी से हैश मैप का उपयोग करके अपना खुद का निर्माण कर सकते हैं।

http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multiset.html

+0

thats महान के लिए धन्यवाद शांत है, लेकिन गिनती कैसे प्राप्त करें? – Harish

+0

ध्यान दें कि Google संग्रह को जावा 5 की आवश्यकता है, हालांकि। इसके अलावा, मेरे जवाब से भी करना आसान है। –

+0

आप एंट्रीसेट() पर इंटरैटिंग करके गिनती प्राप्त कर सकते हैं। यदि आप गिनती को स्ट्रीम करना चाहते हैं तो आप गणना के समय श्रोता को सूचित करने के लिए कार्यान्वयन का विस्तार कर सकते हैं। – pjp

4

चूंकि यह प्रश्नकर्ता कि जेनरिक इस्तेमाल नहीं किया जा सकता है द्वारा उल्लेख किया गया था, के रूप में लक्ष्य मंच जावा 1.4 थी, एक Apache Commons Collections जो जेनरिक का उपयोग नहीं करता इस्तेमाल कर सकते हैं।

answer by pjp उल्लेख करता है कि एक बैग का उपयोग किया जा सकता है।

यह पता चला है कि अपाचे कॉमन्स संग्रह में Bag है जिसमें getCount विधि है जो Bag में जोड़े गए किसी निश्चित ऑब्जेक्ट की गिनती वापस कर देगी।

निम्नलिखित एक उदाहरण है कि add कुछ Integer एक HashBag को वस्तुओं, और मायने रखता है कि कैसे प्रत्येक Integer वस्तु के कई कि Bag शामिल हैं:

Bag b = new HashBag(); 

b.add(Integer.valueOf(1)); 
b.add(Integer.valueOf(2)); 
b.add(Integer.valueOf(2)); 
b.add(Integer.valueOf(3)); 

System.out.println("Count for 1: " + b.getCount(Integer.valueOf(1))); 
System.out.println("Count for 2: " + b.getCount(Integer.valueOf(2))); 
System.out.println("Count for 3: " + b.getCount(Integer.valueOf(3))); 

परिणाम थे:

 
Count for 1: 1 
Count for 2: 2 
Count for 3: 1 

(मुझे एक अस्वीकरण जोड़ना चाहिए कि यह कोड वास्तव में संकलित और जावा 6 पर चलाया गया था, लेकिन मेरा मानना ​​है कि मैंने केवल उन सुविधाओं का उपयोग किया है जो प्री-जावा 5 दिनों से मौजूद थे।)

+0

शानदार है ... मैं आपके लिए वोट देना चाहता हूं लेकिन मुझे अभी तक प्रतिष्ठा नहीं मिली है ... प्रतिक्रिया – Harish

+1

+1 के लिए धन्यवाद, और यह स्वीकार्य उत्तर होना चाहिए। ऐसा करने का एकमात्र संभावित कारण बाहरी पुस्तकालयों का डर है (जो मेरे पास है)। –

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