2010-08-20 23 views
11

मेरे जावा एप्लिकेशन में मुझे दो सूची के तत्व की तुलना करने की आवश्यकता है चाहे वह समान है या नहीं।ऐरेलिस्ट तत्व केस-असंवेदनशील

कम मान लीजिए में मैं दो सूची घोषित की है नीचे

List<String> a = new ArrayList<String>(); 
    a.add("one"); 
    a.add("three"); 
    a.add("two"); 
Collections.sort(a); 


List<String> a1 = new ArrayList<String>(); 
    a1.add("ONE"); 
    a1.add("two"); 
    a1.add("THREE"); 
Collections.sort(a); 

से पता चला की तरह अगर मैं एक शर्त समानता के लिए यह विफल लिखने के रूप में सूची के तत्व से कुछ की तरह

if(a.equals(a1)){ 
    System.out.println("equal"); 
} else{ 
    System.out.println("not equal"); 
} 

यह होगा अलग मामले में है प्रदर्शन परिणाम "बराबर नहीं"

तो कृपया मुझे बताएं कि मैं केवल जावा भाषा में सूची तत्व केस-असंवेदनशील कैसे बना सकता हूं।

धन्यवाद और संबंध

+2

equalsIgnoreCase() स्ट्रिंग्स की सूची सॉर्ट करने के लिए। एचटीएमएल # equalsIgnoreCase (java.lang।स्ट्रिंग) –

+1

समाधान * तत्व * केस-असंवेदनशील बनाने के लिए नहीं है (जो तकनीकी रूप से स्ट्रिंग को अनुकरण करने का मतलब होगा - कोई इसे विस्तारित नहीं कर सकता क्योंकि यह अंतिम है - एक रैपर वर्ग के साथ जिसका * बराबर * और * तुलना करने के लिए * विधियां हैं - असंवेदनशील), बल्कि * तुलना * केस-असंवेदनशील बनाने के लिए। – user359996

उत्तर

20

क्यों एक मामले असंवेदनशील तुलनित्र के साथ बजाय एक SortedSet का उपयोग नहीं? String.CASE_INSENSITIVE_ORDER तुलनित्र

अपने कोड के साथ किसी भी मुद्दे

संपादित टिप्पणियों के अनुसार संशोधित बिना

Set<String> a = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
    a.add("one"); 
    a.add("three"); 
    a.add("two"); 


Set<String> a1 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
    a1.add("ONE"); 
    a1.add("two"); 
    a1.add("THREE"); 

और अपने बराबरी की स्थिति काम करना चाहिए करने के लिए कम है। आप सभी को सही करने के लिए धन्यवाद।

+1

(आपको कस्टम तुलनित्र का उपयोग करने के लिए एक अलग ट्रीसेट निर्माता का उपयोग करना होगा) –

+2

आपको वास्तव में * अपने नमूना कोड में परिभाषित 'तुलनाकर्ता' का उपयोग करना चाहिए ;-) –

+3

स्ट्रिंग क्लास पर 'स्ट्रिंग.CASE_INSENSITIVE_ORDER' स्थिर तुलनाकर्ता भी देखें –

7

आपको लगता है कि मैन्युअल रूप से करना होगा: मामले की अनदेखी सॉर्ट करने के लिए

public boolean equalsIgnoreCase(List<String> l1, List<String> l2) { 
    if (l1.size() != l2.size()) { 
    return false; 
    } 
    Iterator<String> i1=l1.iterator(); 
    Iterator<String> i2=l2.iterator(); 
    while(i1.hasNext()) { 
    if (!i1.next().equalsIgnoreCase(i2.next()) { 
     return false; 
    } 
    } 
    return true; 
} 
+0

ओह, बेवकूफ टाइपो, धन्यवाद gizmo ;-) –

14

आप क्रम में

Collections.sort(a, String.CASE_INSENSITIVE_ORDER); 

उपयोग करने की आवश्यकता है, तो आप उपयोग कर सकते हैं equalsIgnoreCase मूल्यों की तुलना करने के लिए स्ट्रिंग पर विधि

आप निश्चित रूप से अपना स्वयं का केसइन्स बना सकते हैं ensitiveList क्लास, हमारे पास एक CaseInsensitiveSet & हमारे कोडबेस

+1

यह एक पूर्ण समाधान नहीं है (न ही मेरी पोस्ट नीचे है ;-))। –

+0

जैसा कि जोआचिम कहता है, यह ** ** नहीं करेगा। 'असमान (ए 1)' वापसी सही है। –

+0

हां, मैंने बहुत जल्द पोस्ट किया है, मैंने अपना मूल उत्तर –

0

में केसइन्सेंसिवैप है, आपको सूची में बराबर() विधि को ओवरराइड करने की आवश्यकता होगी ताकि यह वही हो जो आप चाहते हैं। वर्तमान ArrayList.equals() पर एक नज़र डालें और इसे अनुकूलित करें ताकि यह बराबर() के बराबर इग्नोरकेज़ के साथ तुलना करता है।

+0

या आप इसे एक कन्स्ट्रक्टर तर्क के रूप में एक तुलनित्र लेते हैं। लेकिन समस्या यह है कि इनमें से दोनों 'संग्रह' के अनुबंध का उल्लंघन करते हैं और इससे चीजों को उम्मीद के अनुसार काम नहीं कर सकता है। –

6

तुम भी एक सहायक वर्ग में अपने स्ट्रिंग लपेटो और लागू के बराबर होती है & इसके लिए तरीकों की तुलना कर सकते हैं।

public class StringWrapper implements Comparable<StringWrapper> { 
    private String value; 

    StringWrapper(Strig value) { 
     this.value = value; 
    } 

    @Override boolean equals(Object o) { 
     returns String.CASE_INSENSITIVE_ORDER.equals(
      (StringWrapper) o).value 
      this.value); 
    } 

    @Override int compareTo(StringWrapper sw) { 
     returns String.CASE_INSENSITIVE_ORDER.compare(
      this.value 
      sw.value);   
    } 

    @Override String toString() { 
     return this.value; 
    } 

    @Override int hashCode() { 
     return this.value.toLowerCase.hashCode(); 
    } 
} 

And then : 

List<StringWrapper> a = new ArrayList<StringWrapper>(); 
    a.add(StringWrapper("one")); 
    a.add(StringWrapper("TWO")); 
    a.add(StringWrapper("three")); 
Collections.sort(a); 
+0

आपको 'तुलनात्मक <स्ट्रिंगवॉपर>' लागू करना चाहिए, और 'तुलना (ऑब्जेक्ट)' विधि 'तुलना करें (स्ट्रिंगवापर) की तुलना करें। आपको 'हैशकोड()' भी लागू करना चाहिए, जो मुश्किल हो सकता है। –

+0

(स्ट्रिंगवॉपर को 'तुलनात्मक' इंटरफ़ेस को कार्यान्वित करने की आवश्यकता है - अन्यथा 'संग्रह .sort' एक संकलन समय त्रुटि का कारण बनता है) –

+0

यह निश्चित रूप से जाने का तरीका है (+1) –

0

आप जिस सूची का उपयोग कर रहे हैं उसमें एक रैपर वर्ग लिखने के बारे में, यह तत्वों के असंगत भंडारण से बचने के लिए बच जाएगा। http://download-llnw.oracle.com/javase/6/docs/api/java/lang/String -

public class CaseInsensitiveStringList extends ArrayList<String> { 

    @Override 
    public void add(final int index, final String element) { 
     super.add(index, element.toLowerCase()); 
    } 

    @Override 
    public boolean add(final String o) { 
     return super.add(o.toLowerCase()); 
    } 

    @Override 
    public boolean addAll(final Collection<? extends String> c) { 
     final ArrayList<String> temp = new ArrayList<String>(c.size()); 
     for (final String s : c) { 
      temp.add(s.toLowerCase()); 
     } 
     return super.addAll(temp); 
    } 

    @Override 
    public boolean addAll(final int index, final Collection<? extends String> c) { 
     final ArrayList<String> temp = new ArrayList<String>(c.size()); 
     for (final String s : c) { 
      temp.add(s.toLowerCase()); 
     } 
     return super.addAll(index, temp); 
    } 
} 
0

अनदेखी मामले

Arrays.sort(myArray, Collator.getInstance()); 
संबंधित मुद्दे