2012-08-03 31 views
25

मैं स्ट्रिंग के माध्यम से तारों की स्थिर सरणी को सॉर्ट करना और द्विआधारी करना चाहता हूं। तुलना करने के लिए तुलनात्मक रूप से।जावा एक तुलनित्र ऑब्जेक्ट के रूप में स्ट्रिंग तुलना करें

समस्या यह है कि सॉर्टिंग और बाइनरी खोज दोनों की आवश्यकता होती है कि एक तुलनात्मक वस्तु को पारित किया जाए - तो मैं अंतर्निहित स्ट्रिंग तुलनित्र में कैसे पास करूं?

उत्तर

18

Arrays वर्ग sort() और binarySearch() के संस्करणों जो एक Comparator. उदाहरण के लिए की आवश्यकता नहीं है, तो आप the version of Arrays.sort() which just takes an array of objects उपयोग कर सकते हैं। ये विधियां सरणी में ऑब्जेक्ट्स की compareTo() विधि को कॉल करती हैं।

27

आप yourslef एक Comparator की आवश्यकता होगी, मिलती है, तो अपने स्वयं के तुलनित्र

public class ExampleComparator implements Comparator<String> { 
    public int compare(String obj1, String obj2) { 
    if (obj1 == null) { 
     return -1; 
    } 
    if (obj2 == null) { 
     return 1; 
    } 
    if (obj1.equals(obj2)) { 
     return 0; 
    } 
    return obj1.compareTo(obj2); 
    } 
} 
+0

+1 लागू करने के लिए कंप्रेसर –

+8

'तुलनाकर्ता' एक सामान्य प्रकार है, इसलिए 'उदाहरणकंपेटर' को चेतावनियों से बचने के लिए शायद 'तुलनाकर्ता ' लागू करना चाहिए। – theisenp

+0

स्ट्रिंग तुलनित्र के लिए, उन्हें तुलना करने से पहले लोअरकेस (या अपरकेस) स्ट्रिंग को ध्यान में रखें अन्यथा आपको यह आदेश प्राप्त करना चाहिए ए-ज़ा-जे –

11

लिख सकते हैं, और आप पहले से ही Guava उपयोग करते हैं, आप Ordering.natural() उपयोग कर सकते हैं।

10

यह Comparable वस्तु के किसी भी प्रकार के लिए एक सामान्य Comparator, नहीं है सिर्फ String:

package util; 

import java.util.Comparator; 

/** 
* The Default Comparator for classes implementing Comparable. 
* 
* @param <E> the type of the comparable objects. 
* 
* @author Michael Belivanakis (michael.gr) 
*/ 
public final class DefaultComparator<E extends Comparable<E>> implements Comparator<E> 
{ 
    @SuppressWarnings("rawtypes") 
    private static final DefaultComparator<?> INSTANCE = new DefaultComparator(); 

    /** 
    * Get an instance of DefaultComparator for any type of Comparable. 
    * 
    * @param <T> the type of Comparable of interest. 
    * 
    * @return an instance of DefaultComparator for comparing instances of the requested type. 
    */ 
    public static <T extends Comparable<T>> Comparator<T> getInstance() 
    { 
     @SuppressWarnings("unchecked") 
     Comparator<T> result = (Comparator<T>)INSTANCE; 
     return result; 
    } 

    private DefaultComparator() 
    { 
    } 

    @Override 
    public int compare(E o1, E o2) 
    { 
     if(o1 == o2) 
      return 0; 
     if(o1 == null) 
      return 1; 
     if(o2 == null) 
      return -1; 
     return o1.compareTo(o2); 
    } 
} 

कैसे String साथ उपयोग करने के लिए:

Comparator<String> stringComparator = DefaultComparator.getInstance(); 
+1

क्षमा करें, मैं हेडर को गलत तरीके से पढ़ता हूं। मैंने पैकेज java.util पढ़ा! – Sharcoux

+0

@ शार्कोक्स मैं देखता हूं! सी -: = –

+0

उस वर्ग के लिए निम्न कोड जोड़ने के लिए अच्छा हो सकता है: सार्वजनिक स्थिर <टी फैली तुलनीय > तुलनाकारी getReversedInstance() { वापसी Collections.reverseOrder ((तुलनाकारी ) getInstance()); } –

6

इसके अलावा, अगर आप केस-संवेदी तुलना करना चाहते हैं, जावा के हाल के संस्करणों में String कक्षा में public static final फ़ील्ड CASE_INSENSITIVE_ORDER नामक फ़ील्ड है जो Comparator<String> प्रकार है, जैसा कि मैंने अभी हाल ही में पाया है। तो, आप String.CASE_INSENSITIVE_ORDER का उपयोग करके अपना काम पूरा कर सकते हैं।

+0

यह सही उत्तर है। – tallseth

+0

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

9

फिर से, Arrays.binarySearch(Object[] a, Object key) के लिए तुलनित्र की आवश्यकता नहीं है जब तक कि वस्तुओं के प्रकार तुलनीय हैं, लेकिन लैम्ब्डा अभिव्यक्तियों के साथ यह अब आसान तरीका है। String::compareTo

उदाहरण के लिए::

सीधे शब्दों में विधि संदर्भ के साथ तुलनित्र की जगह

Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo); 

तुम भी

Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b)); 

इस्तेमाल कर सकते हैं लेकिन फिर भी lambdas से पहले, वहाँ हमेशा गुमनाम वर्गों थे:

Arrays.binarySearch(
       someStringArray, 
       "The String to find.", 
       new Comparator<String>() { 
        @Override 
        public int compare(String o1, String o2) { 
         return o1.compareTo(o2); 
        } 
       }); 
2

हम असंवेदनशील क्रम में स्ट्रिंग की तुलना करने के लिए स्ट्रिंग.CASE_INSENSITIVE_ORDER तुलनित्र का उपयोग कर सकते हैं। जावा 8 java.util.Comparator.comparing(...) के आधार पर के लिए

Arrays.binarySearch(someStringArray, "The String to find.",String.CASE_INSENSITIVE_ORDER); 
15

समाधान:

Comparator<String> c = Comparator.comparing(String::toString); 

या

Comparator<String> c = Comparator.comparing((String x) -> x); 
+0

या Comparator.comparing (Function.identity()) – ailveen

-1

के बारे में Nambari के answer कहीं कोई गलती हुई।आप डबल बराबर के चिह्न का उपयोग कर == कार्यक्रम विधि की तुलना तक पहुँचने कभी नहीं होगा, जब तक कि कोई नई कीवर्ड का उपयोग स्ट्रिंग वस्तु जो सबसे अच्छा अभ्यास नहीं है बनाने के लिए होगा मूल्यों की तुलना करते हैं। यह थोड़ा बेहतर समाधान हो सकता है:

public int compare(String o1, String o2) { 
     if (o1 == null && o2 == null){return 0;} 
     if (o1 == null) { return -1;} 
     if (o2 == null) { return 1;} 
     return o1.compareTo(o2); 
    } 

पीएस टिप्पणी के लिए धन्यवाद;)

+1

आपको थोड़ा सा जवाब समझा जाना चाहिए। http://stackoverflow.com/help/how-to-answer –

+1

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, _why_ और/या _how_ के संबंध में अतिरिक्त संदर्भ का उत्तर देता है, यह प्रश्न इसके दीर्घकालिक मान में काफी सुधार करेगा। कुछ स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें। –

+1

यह प्रभावी रूप से नंबारी के [उत्तर] (http://stackoverflow.com/a/11804763/369450) से अलग कैसे है? – cpburnz

0

String.CASE_INSENSITIVE_ORDER साथ माइक Nakis का अच्छा जवाब सामान्यीकरण करने के लिए, आप भी उपयोग कर सकते हैं:

Collator.getInstance(); 

देखें Collator

4

ठीक है यह कुछ साल बाद है, लेकिन जावा 8 के साथ आप Comparator.naturalOrder() का उपयोग कर सकते हैं:

http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder--

जावाडोक से:

static <T extends Comparable<? super T>> Comparator<T> naturalOrder() 

एक तुलनित्र लौटाता है जो प्राकृतिक क्रम में तुलनात्मक वस्तुओं की तुलना करता है। लौटा हुआ तुलनित्र धारावाहिक है और शून्य की तुलना करते समय NullPointerException फेंकता है।

+0

संभावित उत्तरों के लिए लिंक हमेशा स्वागत है, लेकिन अगर लिंक हटा दिया जाता है तो कृपया यहां सबसे महत्वपूर्ण भागों को जोड़ें। –