2011-09-27 14 views
16

द्वारा तारों की ऐरेलिस्ट को क्रमबद्ध करें, मैं लंबाई के अनुसार तारों की एक ऐरेलिस्ट को ऑर्डर करना चाहता हूं, लेकिन न केवल संख्यात्मक क्रम में।लंबाई

उदाहरण के लिए

कहो, सूची इन शब्दों में शामिल है:

cucumber 
aeronomical 
bacon 
tea 
telescopic 
fantasmagorical 

वे उदाहरण के लिए, एक विशेष स्ट्रिंग के लिए लंबाई में उनके अंतर द्वारा आदेश दिया करने की आवश्यकता:

intelligent 

तो अंतिम सूची इस तरह दिखेगा (ब्रैकेट में अंतर):

aeronomical  (0) 
telescopic  (1) 
fantasmagorical (3) - give priority to positive differences? doesn't really matter 
cucumber  (3) 
bacon   (6) 
tea    (8) 

उत्तर

27

एक कस्टम तुलनित्र का उपयोग करें:

public class MyComparator implements java.util.Comparator<String> { 

    private int referenceLength; 

    public MyComparator(String reference) { 
     super(); 
     this.referenceLength = reference.length(); 
    } 

    public int compare(String s1, String s2) { 
     int dist1 = Math.abs(s1.length() - referenceLength); 
     int dist2 = Math.abs(s2.length() - referenceLength); 

     return dist1 - dist2; 
    } 
} 

फिर java.util.Collections.sort(List, Comparator) का उपयोग करके सूची को सॉर्ट करें।

+0

सकारात्मक मतभेदों की प्राथमिकता दो से सकारात्मक मतभेदों को गुणा करके, और नकारात्मक दो के नकारात्मक अंतर, फिर एक जोड़कर दी जा सकती है। –

+0

आपको संदर्भ लम्बाई अंतिम बनाना चाहिए। –

4

आप इसे Collections.sort() के संस्करण के साथ ऐसा करेंगे जो एक स्पष्ट Comparator लेता है।

+0

@downvoter - क्या आप पसंद करेंगे कि मैंने ओपी को पढ़ाने के बजाय, जानकारी कहां से जवाब दिया था? – parsifal

+7

डाउनवॉटेड क्योंकि ... खुजली उंगली उंगली? यह एक टिप्पणी होनी चाहिए? पारसी के दुश्मन की शपथ ली? –

+2

उपरोक्त टिप्पणी के कारण डाउनवॉटेड: डी – user1613360

5
This will help you - String in Ascending order 


class StringLengthListSort implements Comparator<String>{ 

    @Override 
    public int compare(String s1, String s2) { 
    return s1.length() - s2.length(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<String>(); 
    StringLengthListSort ss = new StringLengthListSort(); 
    list.add("ram"); 
    list.add("rahim"); 
    list.add("ramshyam"); 
    Collections.sort(list, ss); 
    System.out.println(list); 
    } 

} 
5

8+ आप (@ के रूप में Barend के जवाब) लागू करने के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं जावा उपयोग कर रहे हैं तुलनित्र

List<String> strings = Arrays.asList(new String[] {"cucumber","aeronomical","bacon","tea","telescopic","fantasmagorical"}); 
strings.sort((s1, s2) -> Math.abs(s1.length() - "intelligent".length()) - Math.abs(s2.length() - "intelligent".length())); 
+1

जावा 8+ के लिए सबसे अच्छा समाधान। लघु और सटीक। –

-1

मुझे लगता है कि प्रस्तावित समाधान अवैध हैं।

तुलनात्मक इंटरफ़ेस अनुबंध मांग करता है कि तुलना विधि बराबर विधि के अनुरूप हो।

इसका मतलब है कि यदि आपके पास x.compareTo(y) == 0 है तो आपके पास x.equals(y) == true होना चाहिए।

तो, शायद समाधान अभ्यास में काम करते हैं, लेकिन उनकी गारंटी नहीं है, और अगली रिलीज में तोड़ सकती है।

+1

यदि यह मामला था, तो आप * किसी * कस्टम स्ट्रिंग तुलनित्र नहीं बना सके। – Clashsoft

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