2009-11-07 13 views
7

ठीक है, मैंने ट्रीमैप का परीक्षण किया लेकिन यह स्ट्रिंग तुलना पर IgnoreCase खाते में नहीं लेता है। मुझे शब्दावली से निपटने और मामले को अनदेखा करने की आवश्यकता है। क्या कोई और तरीका है?इग्नोरकेस के साथ कुंजी द्वारा <स्ट्रिंग, ऑब्जेक्ट> मानचित्र को क्रमबद्ध करें?

धन्यवाद, यह काम करता है (TreeMap (तुलनात्मक सी))। हालांकि, मेरे पास एक और सवाल है:

public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() { 

    public int compare(Object h1, Object h2) { 
      String s1 = h1.getId(); 
      String s2 = h2.getId(); 
      return s1.compareToIgnoreCase(s2); 
    } 
}; //STR_IGN_CASE_COMP 

मैं विभिन्न वस्तुओं के साथ तुलना करने के लिए तुलनित्र को सार्वभौमिक कैसे बना सकता हूं? मानते हैं कि सभी को getId() विधि है।

धन्यवाद, मार्टिन

+7

मार्टिन, प्रश्न को पूरी तरह से बदलने का अच्छा विचार नहीं है। ऐसा करने वाला विशेषाधिकार वाला अगला उपयोगकर्ता (शायद आप) इसे अपने पिछले राज्य में वापस लेना चाहिए। बस एक नया सवाल पोस्ट करें! –

+1

+1, सहमत है, जब कोई आपको अपने प्रश्न का उत्तर देता है, तो आपको जवाब स्वीकार करना चाहिए और यदि कोई उठता है तो उसे एक नए प्रश्न पर जाना चाहिए। – camickr

+0

मैंने इसे वापस घुमाया है। – finnw

उत्तर

34

आप TreeMap constructor में एक Comparator उपयोग करना चाहते हैं। विशेष रूप से, String.CASE_INSENSITIVE_ORDER देखें।

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

Collator या एक कस्टम का उपयोग करना Comparator एक गैर अंग्रेजी स्थान में आपके लिए बेहतर काम कर सकते हैं या यदि आप और अधिक जटिल आदेश की जरूरत है।

+2

+1। – tangens

+0

याद रखें - यदि आप एक अंग्रेजी प्रोग्रामर हैं, और आप उन चाबियों के नियंत्रण में हैं जिन्हें आपको * लोकेल के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि मूल्यों पर तुलना नहीं की जा रही है, वे पर किए जा रहे हैं कुंजी ;-) –

1

यह एक तुलनाकारी कि तार मामले पर ध्यान नहीं दिया तुलना प्रदान करें।

ट्री-मैप (तुलनाकारी ग)

0

आप एक सूची थी, तो मैं एक तुलनाकारी साथ Collections.sort() की कोशिश कहेंगे। आपको अपने स्वयं के तुलनात्मक को रोल करना पड़ सकता है जो बराबर() के बजाय String.equalsIgnoreCase() का उपयोग करता है।

public static <T> void sort(List<T> list, 
         Comparator<? super T> c) 

लेकिन मैं सही रास्ते पर था। ट्रीमैप कन्स्ट्रक्टर का प्रयास करें जो एक तुलनाकर्ता लेता है:

public TreeMap(Comparator<? super K> comparator) 
6

सबसे अच्छा तरीका कोलेटर का उपयोग करना होगा। एक कॉललेटर कक्षा में निर्मित होता है, जो तुलनात्मक रूप से लागू करता है, और इसलिए आप इसे अपने TreeMap के लिए उपयोग कर सकते हैं।

एक कॉललेटर के साथ, आप तुलना की ताकत को भी नियंत्रित कर सकते हैं, उदाहरण के लिए, यदि आप उच्चारण-असंवेदनशील होना चाहते हैं।

Collator stringCollator = Collator.getInstance(); 
stringCollator.setStrength(Collator.PRIMARY); 
new TreeMap<String, String>(stringCollator) 
0

हां, आप जो चाहते हैं वह ट्रीमैप कन्स्ट्रक्टर का उपयोग करना है जो एक तुलनाकर्ता लेता है। एक तुलनित्र बनाएं जो तुलना ToIgnoreCase का उपयोग करता है।

0

मुझे संदेह है कि आपको कस्टम तुलनात्मक के साथ अपना TreeMap बनाना चाहिए।

import java.text.Collator; 
import java.util.Comparator; 

class IgnoreCaseComp implements Comparator<String> { 
    Collator col; 

    IgnoreCaseComp() { 
    col = Collator.getInstance(); 

    col.setStrength(Collator.PRIMARY); 
    } 

    public int compare(String strA, String strB) { 
    return col.compare(strA, strB); 
    } 
} 
0

मैं अलग-अलग ऑब्जेक्ट्स के साथ काम करने के लिए तुलनित्र को सार्वभौमिक कैसे बना सकता हूं? मानते हैं कि सभी को getId() विधि है।

आपको BeanComparator का उपयोग करने में सक्षम होना चाहिए।

+0

मैंने इस सवाल की सिफारिश की है कि प्रश्न मूल प्रश्न पर वापस लाया जाए और इसके बजाय एक नया प्रश्न पोस्ट किया जाए; अगर और जब ऐसा होता है, तो यह उत्तर शायद हटा दिया जाना चाहिए। –

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