2013-12-16 9 views
6

पर डुप्लिकेट प्रविष्टियों को रोकना मैं डुप्लिकेट प्रविष्टियों को एक ऐरेलिस्ट में जोड़ने से रोकने की कोशिश कर रहा हूं क्योंकि फ़ाइल की प्रत्येक पंक्ति के माध्यम से सूची को पॉप्युलेट किया जा रहा है। फ़ाइल की प्रत्येक पंक्ति "नोड 1 नोड 2" (टैब डिलीमीटर) प्रारूप में है। यहां एक डुप्लिकेट या तो "नोड 1 नोड 2" या "नोड 2 नोड 1" हो सकता है। यहाँ कोशिश करते हैं और यह कार्रवाई करने के लिए मेरे कोड है:जावा: एक ऐरेलिस्ट

while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    for (int i=0; i <= edgesnumber; i++) { //edgesnumber = edges.size() 

     if (tempnodelist[0] && tempnodelist[1] != edges.get(i)) { 

      edges.add(line); 

      } 
     } 

    nodes.add(tempnodelist[0]); 
    nodes.add(tempnodelist[1]); //intial intended use of tempnodelist. 

}

के बाद से मैं पहले से ही प्रत्येक पंक्ति बंटवारे रहा हूँ प्रत्येक नोड के एक HashSet बनाने के लिए, मैं इस का उपयोग करने के डुप्लिकेट की जांच करने के लिए कोशिश कर रहा हूँ । फिलहाल मुझे सिंटैक्स सही नहीं लगता है। मैं डुप्लिकेट के लिए ArrayList की पिछली प्रविष्टियों के माध्यम से कैसे जांच सकता हूं, और उन्हें जोड़ने से रोकने के लिए, क्या ArrayList को पॉप्युलेट करना जारी रखता है? वर्तमान में इस कोड के साथ क्या गलत है?

अग्रिम में किसी भी सवाल का

धन्यवाद कहें अगर कुछ भी स्पष्ट नहीं है,!

+4

आप डुप्लिकेट प्रविष्टियों नहीं करना चाहते हैं, तो आप चाहते हैं एक 'Set', न कि एक' List'। –

+0

लेकिन प्रविष्टियों को उलट दिया जा सकता है, अभी भी एक डुप्लिकेट के रूप में गिना जाएगा ... सेट यह नहीं देख पाएगा? – user2941526

+0

डुप्लीकेट खोजने के लिए सेट 'बराबर() 'का उपयोग करता है। आपको उस ऑब्जेक्ट के लिए एक विशिष्ट श्रेणी बनाना चाहिए जिसे आप अपने सेट में रखना चाहते हैं और इस वर्ग पर 'बराबर() 'को फिर से परिभाषित करना चाहिए। –

उत्तर

12

एक LinkedHashSet का प्रयोग करें और फिर इसे एक ArrayList में बदलने का है, क्योंकि एक LinkedHashSet एक उम्मीद के मुताबिक यात्रा के क्रम (प्रविष्टि-आदेश) है और यह एक Set है।

उदाहरण

LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); 

uniqueStrings.add("A"); 
uniqueStrings.add("B"); 
uniqueStrings.add("B"); 
uniqueStrings.add("C"); 
uniqueStrings.add("A"); 

List<String> asList = new ArrayList<String>(uniqueStrings); 
System.out.println(asList); 

इच्छा उत्पादन

[A, B, C] 
+0

मैं कक्षा ऑब्जेक्ट के साथ ArrayList के साथ इसका उपयोग करना चाहता हूं, यह काम नहीं किया। –

+0

@AnantShah आप 'ArrayList' में अद्वितीय' कक्षा 'ऑब्जेक्ट चाहते हैं? क्या तुम्हारे कहने का मतलब यही था? और क्या काम नहीं किया? जब मैं कोशिश करता हूं, यह काम करता है। मुझे लगता है कि टिप्पणियों का उपयोग करने में आपकी मदद करना मुश्किल है। कृपया एक प्रश्न पूछें और उदाहरण कोड प्रदान करें। –

+0

मैंने कोशिश की और यह सरणीसूची के समान आकार को लौटा, जिसमें डुप्लिकेट क्लास ऑब्जेक्ट डेटा है। लेकिन इसके लिए मैं क्लास ऑब्जेक्ट फ़ाइल के अंदर दो विधियों को बराबर() और हैशकोड() को ओवरराइड करता हूं। और फिर यह काम किया। आपके समाधान और त्वरित उत्तर के लिए धन्यवाद। :) –

0

के लिए सबसे पहले, का उपयोग के बराबर होती है तार तुलना करने के लिए।

दूसरे, आप सेट बजाय एक सूची

उपयोग कर सकते हैं और अंत में, आप अगर आइटम पहले से मौजूद जाँच करने के लिए contains विधि का उपयोग कर सकते हैं।

1

ऐरेलिस्ट के लिए प्रत्येक अतिरिक्त के लिए आपको सभी पिछली प्रविष्टियों पर पुन: प्रयास करना होगा और जांचें कि क्या डुप्लिकेट प्रविष्टि मौजूद है (आप .contains() का उपयोग कर सकते हैं) जो ओ (एन) है।

बेहतर मैं एक सेट का उपयोग करने का सुझाव दूंगा।

2

आप लाइनों के आदेश पढ़ें सूची का उपयोग कर रखने रखने के लिए लेकिन डुप्लिकेट के लिए आप (जैसा कि आप वर्णित अपने दो रूपों में) अगर एक लाइन का निर्धारण करने के लिए एक सेट का उपयोग कर सकते हैं पहले से ही जोड़ा गया है चाहते हैं:

Set<String> duplicates = new HashSet<String>(); 
while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    String lineReversed = tempnodelist[1] + delimiter + tempnodelist[0]; 

    if (!duplicates.contains(line) && !duplicates.contains(lineReversed)) { 
     edges.add(line); 
    } 
} 
+0

रिवर्स() "node2 node1" को "1edon 2edon" में बदल देगा "लूप के बाहर 'डुप्लिकेट नहीं होना चाहिए? –

+1

ओह ठीक है ... मैं उस – giorashc

+0

को ठीक कर दूंगा क्योंकि किसी कारण से यह डुप्लिकेट को जोड़ने से रोक नहीं रहा है। "123 234" और "234 123" के एक txt को इनपुट करने से अभी भी दोनों प्रविष्टियों के साथ ArrayList पॉप्युलेट किया गया है:/ – user2941526

-1

यह क्या आप वास्तव में चाहते हैं एक Set<Set<String>>

Set<Set<String>> pairs = ... 
try(BufferedReader br = ...) { 
    for(String line; (line = br.readLine()) != null;) 
     pairs.add(new HashSet<String>(Arrays.asList(line.split(" "))); 
} 

यह डुप्लिकेट के बिना जोड़े का एक संग्रह शब्द के आदेश की परवाह किए बिना बनाता है जैसा लगता है।

0
ArrayList<String> ar=new ArrayList<String>(); 
String a[]={"cat","bat","cat","knife"}; 
for(int i=0;i<a.length;i++){ 
    if(!ar.contains(a[i])){ 
     ar.add(a[i]); 
    } 
} 

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

ऊपर कोड के लिए सरणी सूची में तत्वों होगा

cat bat knife

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