2013-05-14 13 views
9

साथ स्ट्रिंग की एक सरणी सॉर्ट करना मैं एक String सरणी है:कस्टम आदेश देने

String[] str = {"ab" , "fog", "dog", "car", "bed"}; 
Arrays.sort(str); 
System.out.println(Arrays.toString(str)); 

अगर मैं Arrays.sort उपयोग करते हैं, उत्पादन होता है:

[ab, bed, car, dog, fog] 

लेकिन मैं निम्नलिखित आदेश लागू करने की आवश्यकता:

FCBWHJLOAQUXMPVINTKGZERDYS

मुझे लगता है कि मुझे im की आवश्यकता है Comparator plement और compare विधि ओवरराइड:

Arrays.sort(str, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 
    }); 

मैं इस को हल करने के बारे में जाना कैसे करना चाहिए?

+2

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

+0

@ डंकन जोन्स नहीं वे नहीं हैं, यह सिर्फ एक उदाहरण था। मैंने उन्हें बदल दिया। धन्यवाद – Sam

+0

@ सैम: तो स्ट्रिंग में प्रत्येक व्यक्तिगत चरित्र को क्रमबद्ध किया जाना चाहिए और फिर "सामान्य" स्ट्रिंग नियम लागू होते हैं? "ए" के सापेक्ष क्रमबद्ध "एए" कैसे है? या "एफबी" के सापेक्ष "एफसी"? –

उत्तर

26
final String ORDER= "FCBWHJLOAQUXMPVINTKGZERDYS"; 

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     return ORDER.indexOf(o1) - ORDER.indexOf(o2) ; 
    } 
}); 

तुम भी जोड़ सकते हैं:

o1.toUpperCase() 

अपने सरणी में संवेदनशील मामला है, तो।


जाहिर ओपी केवल अक्षर लेकिन पत्र के तार नहीं तुलना करने के लिए चाहता है, इसलिए यह एक थोड़ा और अधिक जटिल:

public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = ORDER.indexOf(o1.charAt(i)); 
      pos2 = ORDER.indexOf(o2.charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
+3

सावधान: ऊपरी/निचले मामले के भ्रम की वृद्धि। –

+0

@JoachimSauer ने एक संपादन जोड़ा, धन्यवाद –

+1

@MajidL क्या यह * * संवेदनशील में होना चाहिए? – alex

0

यहाँ आप उपयोगी लिंक मिल सकता है:

Using comparator to make custom sort

आपके उदाहरण में बदले में क्लास के विशिष्ट विशेषताओं की तुलना करके आप बेंचमार्क किए गए स्ट्रिंग में चार की संभावना की जांच करने के लिए और इस चेक पर आधार की जांच कर सकते हैं यदि यह महान है एर/बराबर/छोटे।

3

मैं कुछ इस तरह करना होगा:

एक HashTable (यह orderMap कॉल) में पत्र रखो। कुंजी पत्र है, मूल्य ORDER में सूचकांक है।

और फिर:

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int length = o1.length > o2.length ? o1.length: o2.length 
     for(int i = 0; i < length; ++i) { 
      int firstLetterIndex = orderMap.get(o1.charAt(i)); 
      int secondLetterIndex = orderMap.get(o2.charAt(i)); 

      if(firstLetterIndex == secondLetterIndex) continue; 

      // First string has lower index letter (for example F) and the second has higher index letter (for example B) - that means that the first string comes before 
      if(firstLetterIndex < secondLetterIndex) return 1; 
      else return -1; 
     } 

     return 0; 
    } 
}); 

यह केस-संवेदी बनाने के लिए सिर्फ शुरुआत में दोनों तार करने के लिए toUpperCase() से करते हैं।

0

चयनित उत्तर पर सुधार करने के लिए मेरा समय लगा। यह अधिक कुशल

public static void customSort(final String order,String[] array){ 
String[] alphabets={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"}; 
    String keyword=order; 
    for(int g=0; g<alphabets.length; g++){ 
    String one=alphabets[g]; 
    if(!keyword.toUpperCase().contains(one)){keyword=keyword+one;} 
    } 

final String finalKeyword=keyword; 
Arrays.sort(array, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = finalKeyword.toUpperCase().indexOf(o1.toUpperCase().charAt(i)); 
      pos2 = finalKeyword.toUpperCase().indexOf(o2.toUpperCase().charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
}); 
//Arrays.sort(array, Collections.reverseOrder()); 
} 
संबंधित मुद्दे