2009-03-17 4 views
6

ध्यान दें कि मैं वास्तव में यहां डेटाबेस के साथ कुछ भी नहीं कर रहा हूं, इसलिए ओआरएम उपकरण शायद मैं नहीं देख रहा हूं।क्या कोई जावा संग्रह (या समान) है जो ऑटो-आईडी SQL तालिका की तरह व्यवहार करता है?

मैं कुछ कंटेनर रखना चाहता हूं जिनमें प्रत्येक वस्तुएं एक ही कक्षा के एक कंटेनर में सभी वस्तुओं के साथ कई वस्तुओं को पकड़ें। कंटेनर को डेटाबेस तालिका के कुछ व्यवहार दिखाना चाहिए, अर्थात्:

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

"डुप्लिकेट प्रविष्टि" का अनुरोध होने पर त्रुटि को फेंकने के बजाय, कंटेनर को केवल सम्मिलन छोड़ना चाहिए और पहले से मौजूद वस्तु की कुंजी वापस करनी चाहिए।

अब, मैं एक जेनेरिक कंटेनर क्लास लिखूंगा जो कि उन क्षेत्रों को स्वीकार करता है जो कुंजी फ़ील्ड के मान को प्राप्त करने के लिए इंटरफेस को कार्यान्वित करते हैं और वास्तविक स्टोरेज क्लास के रूप में उन मानों के साथ एक हैश मैप का उपयोग करते हैं। मौजूदा अंतर्निर्मित कक्षाओं का उपयोग कर एक बेहतर दृष्टिकोण है? मैं हैशसेट और इसी तरह से देख रहा था, लेकिन वे फिट नहीं लग रहे थे।

उत्तर

4

संग्रह संग्रह कक्षाओं में से कोई भी आपको जो चाहिए वह करेगा। आपको अपना खुद लिखना होगा!

पीएस आपको यह तय करने की भी आवश्यकता होगी कि आपकी कक्षा थ्रेड-सुरक्षित होगी या नहीं।

पी.पी.एस. ConcurrentHashMap करीब है, लेकिन बिल्कुल वही नहीं है। यदि आप इसे उपclass या लपेट सकते हैं या अपने मानचित्र दर्ज करने वाली वस्तुओं को लपेट सकते हैं जैसे कि आप केवल उस वर्ग पर थ्रेड-सुरक्षा के लिए भरोसा कर रहे हैं, तो आपके पास एक कुशल और थ्रेड-सुरक्षित कार्यान्वयन होगा।

1

मैं सोच रहा था कि आप "आईडी" के रूप में सरणी में वर्तमान स्थान का उपयोग करके, ऐरेलिस्ट के साथ ऐसा कर सकते हैं, लेकिन यह आपको किसी मौजूदा स्थान पर डालने से नहीं रोकता है, साथ ही जब आप उस स्थान पर सम्मिलित करते हैं , यह सब कुछ ऊपर ले जाएगा। लेकिन आप एरेडलिस्ट पर अपनी खुद की कक्षा का आधार बना सकते हैं, एक .add के बाद .size() के वर्तमान मान को वापस कर सकते हैं।

3

आप इस व्यवहार को HashSet के साथ अनुकरण कर सकते हैं। यदि आपके द्वारा संग्रह में जोड़े जा रहे ऑब्जेक्ट में एक फ़ील्ड है जिसे आप एक अद्वितीय आईडी के रूप में उपयोग कर सकते हैं, तो उस ऑब्जेक्ट की हैशकोड() विधि (या calculated hash code मान का उपयोग करें, या तो किसी भी तरह से काम करना चाहिए)।

जब आप add डुप्लिकेट प्रविष्टि करते हैं तो हैशसेट त्रुटि को फेंक नहीं देगा, यह केवल झूठा लौटाता है। आप हैशसेट को लपेट सकते हैं (या विस्तारित कर सकते हैं ताकि आपकी ऐड विधि उस अद्वितीय आईडी को लौटा दे जो आप वापसी मूल्य के रूप में चाहते हैं।

1

क्या कोई कारण है कि ऑब्जेक्ट के हैश कोड को "न्यूमेरिक आईडी" के रूप में उपयोग नहीं किया जा सकता है?

यदि नहीं, तो आपको कॉल करने की आवश्यकता होगी, कॉल को एक कंसूरेंट हैश मैप में लपेटें, ऑब्जेक्ट के हैशकोड को वापस करें और PutIfAbsent (के कुंजी, वी मान) विधि का उपयोग यह सुनिश्चित करने के लिए करें कि आप डुप्लिकेट नहीं जोड़ते हैं।

putIfAbsent भी मौजूदा मान देता है, ताकि आप अपने हैशकोड को अपने उपयोगकर्ता पर वापस लौट सकें।

देखें ConcurrentHashMap

+1

@Benjamin: क्योंकि वे अद्वितीय नहीं कर रहे हैं हैश कोड अंकीय आईडी के रूप में नहीं किया जा सकता। – CPerkins

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

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