2012-09-18 7 views
6

मैं structs की एक सूची है में struct के किसी तत्व के structs की एक सूची सॉर्ट करने के लिए है कि मैं struct के एक विशिष्ट तत्व के अनुसार सॉर्ट करने के लिए करना चाहते हैं:कैसे जावा

private class myStruct { 

    public Boolean GUI; 
    public float CallTime; 
    public String ReqID; 
    public String ReqGUID; 
    public String Stereotype; 
    public String StereotypeGUID; 

} 

private List<myStruct> DataList = new ArrayList<myStruct>(); 

मैं कैसे कर सकता प्रकार तत्व द्वारा डेटालिस्ट "ReqID" बिना हार्डकोडिंग के? क्या Arrays.sort() का उपयोग करने की संभावना है?

+0

मैं सुझाव देता हूं कि 'बूलियन' के बजाय 'बूलियन' का उपयोग करने पर विचार करें, 'फ्लोट' के बजाय 'डबल' का उपयोग करें, फ़ील्ड 'अंतिम' और 'निजी' या पैकेज-लोकल को यदि आप कर सकते हैं। –

उत्तर

0

आप अपने खुद के Comparator को परिभाषित कर सकते हैं और उस तुलना में Collections.sort() का उपयोग कर सकते हैं। इस तरह आप विभिन्न क्षेत्रों का उपयोग करके खोज के लिए विभिन्न तुलनित्र परिभाषित कर सकते हैं।

वैकल्पिक रूप से आपकी संरचना Comparable इंटरफ़ेस को कार्यान्वित कर सकती है और Collections.sort() इसका उपयोग करके सॉर्ट कर सकती है। इसे प्राकृतिक सॉर्ट ऑर्डर का उपयोग करके कहा जाता है, क्योंकि यह आपकी कक्षा के लिए निहित है।

यहां Java tutorial on sorting and ordering है।

2

आपको Comparator का उपयोग करना चाहिए।

Arrays.sort(T[] arrayToSort, Comparator<T> yourComparator); 

यह है कि क्या आप एक संग्रह या डेटा संरचना के रूप में एक सरणी का उपयोग बहुत स्पष्ट नहीं है:

class YourComparator implements Comparator<myStruct>{ 

     public int compare(myStruct s1, myStruct s2){ 
       //here comes the comparison logic 
     } 
} 

और फिर sort() विधि के लिए इस प्रपत्र का उपयोग करें।

यदि आप किसी सूची का उपयोग करते हैं, तो Collections.sort() का उपयोग करें।

+1

आप 'Arrays.sort()' का उपयोग 'सूची' के साथ नहीं कर सकते। इसके बजाय 'संग्रह .sort' का प्रयोग करें। – vanje

+0

हां, लेकिन उन्होंने Arrays.sort() का उल्लेख किया, भले ही सवाल की शुरुआत में वह एक सूची के बारे में कुछ कहता है। एक छोटी सी गलतता है। – Razvan

+0

लेकिन उसके कोड में उसके पास एक सूची है और उसने पूछा, अगर वह Array.sort() का उपयोग कर सकता है? तो उत्तर नहीं है। – vanje

1

कस्टम सॉर्टिंग के लिए आप Comparable इंटरफ़ेस को कार्यान्वित कर सकते हैं।

इस इंटरफ़ेस के साथ आप एक विधि compareTo() बनाते हैं जो एक नकारात्मक संख्या, 0 या एक सकारात्मक संख्या देता है। रिटर्न कोड Collections.sort() के आधार पर यह बता सकता है कि तत्व को किसी अन्य तत्व के पहले या बाद में होना चाहिए या नहीं। एक Comparator उदाहरण के साथ java class implements comparable

0

उपयोग java.util.Collections.sort():

एक अच्छा उदाहरण है कि यह कैसे उपयोग करने के लिए इस जवाब में पाया जा सकता। JavaDocs देखें।

0

उपयोग Arrays.sort(T[] a, Comparator<? super T> c)

या Collections.sort(List a, Comparator c)

1

इस

public static void main(String[] args) { 
    List<myStruct> DataList = new ArrayList<myStruct>(); 
    //ADD Objects to DataList here 

    Collections.sort(DataList, new Comparator() { 

     public int compare(Object o1, Object o2) { 
      myStruct p1 = (myStruct) o1; 
      myStruct p2 = (myStruct) o2; 
      int ret = -1; 
      //business logic here 
      if (Integer.parseInt(p1.ReqGUID) == Integer.parseInt(p2.ReqGUID)) { 
       ret = 0; 
      } else if (Integer.parseInt(p1.ReqGUID) > Integer.parseInt(p2.ReqGUID)) { 
       ret = 1; 
      } else if (Integer.parseInt(p1.ReqGUID) < Integer.parseInt(p2.ReqGUID)) { 
       ret = -1; 
      }//end business logic 
      return ret; 
     } 
    }); 

} 
विधि Collections.sort() मैं तुलनाकारी इंटरफेस को लागू कर रहा हूँ और तुलना अधिभावी अंदर

यहाँ की तरह तुलनाकारी इंटरफ़ेस का उपयोग() तरीका। यह वास्तव में तुलना() विधि के अंदर लागू व्यवसाय तर्क के आधार पर आपकी सूची को सॉर्ट करेगा;

+0

बहुत बहुत धन्यवाद! यह बहुत अच्छा काम करता है! – user1679802

+0

@ user1679802 अगर आपको SO पर कोई जवाब पसंद है तो आप इसे ऊपर उठा सकते हैं और इसे स्वीकार कर सकते हैं। मैं खुशी से मदद कर सकता है – MaVRoSCy

0

सरल समाधान

बस java.lang लागू।निम्नलिखित की तरह आप कक्षा में तुलनीय इंटरफ़ेस:

class MyStruct implements Comparable<MyStruct>{ 

    public Boolean GUI; 
    public float CallTime; 
    public String ReqID; 
    public String ReqGUID; 
    public String Stereotype; 
    public String StereotypeGUID; 

    @Override 
    public int compareTo(MyStruct other) { 
    return ReqID.compareTo(other.ReqID); 
    /* also you can use ReqID.compareToIgnoreCase(other.ReqID); */ 
    } 

    @Override 
    public String toString() { 
    return "(" + ReqID + ")"; 
    } 
} 

अवहेलना भी() बस मुद्रण के लिए ToString विधि।

इसके अलावा, कि lexicographical आदेश का उपयोग कर स्ट्रिंग के compareTo() विधि प्रकार को ध्यान में रखना। यदि आप संख्यात्मक आईडी चाहते हैं तो int या अन्य संख्यात्मक प्रकार का उपयोग करना बेहतर है। बाद Arrays.sort() के साथ-साथ Collections.sort() का उपयोग कर सॉर्ट करने के लिए पूरा कोड है - चुनें जो सूट आप :)

public class MyStructSort { 

    private final static String[] STRUCT_IDS = {"C", "D", "A", "Aa", "B", "Z", "Aaa" }; 

    private static List<MyStruct> createList() { 

    List<MyStruct> structList = new ArrayList<MyStruct>(); 
    for (String id: STRUCT_IDS) { 
     MyStruct struct = new MyStruct(); 
     struct.ReqID = id; 
     structList.add(struct); 
    } 
    return structList; 
    } 

    public static void main(String[] args) { 

    List<MyStruct> dataList = createList(); 

    /* Sort using Lists (Collections) */ 
    Collections.sort(dataList); 
    System.out.println("List sort:\t" + dataList); 

    /* Sort using arrays */ 
    MyStruct[] dataArray = dataList.toArray(new MyStruct[dataList.size()]); 
    Arrays.sort(dataArray); 
    // print sorted array 
    System.out.print("Array sort:\t"); 
    for (MyStruct struct: dataArray) { 
     System.out.print(struct+" ");       
    } 
    } 
} 

यह सिर्फ प्रदर्शन कोड है, इसलिए कुछ अशक्त-चेक और getters और setters है इसे सही बनाने के लिए जरूरी होगा।

1

आपका वर्ग संरचना .. मेरे लिए अजीब लग रही है आप के लिए एक निजी वर्ग के भीतर सार्वजनिक क्षेत्र होते हैं .. आदर्श रूप में अपने खेतों निजी चिह्नित किया जाना चाहिए और आप getters और उन तक पहुंचने की setters हो सकता है ..

के रूप में अपने बात नहीं, आप दो महत्वपूर्ण इंटरफेस taht काम के इस प्रकार के लिए परिभाषित कर रहे हैं पर एक नज़र ले जा सकते हैं: - http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html और http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html ..

आप तुलनाकारी का उपयोग करके अपने वर्ग उदाहरण तुलना करने के लिए कई तरीके करना चाहते हैं .. आप कर सकते हैं बस तुलनात्मक इंटरफ़ेस को लागू करने वाली कक्षा बनाएं, और इस वर्ग के उदाहरण को Collections.sort() पर पास करें सॉर्ट करने के लिए इस तुलनाकर्ता का उपयोग करने के लिए विधि .. इस मामले में, तुलना() विधि तुलना की नौकरी करने के लिए उपयोग की जाती है।

वैकल्पिक रूप से, आप उस वर्ग तुलनीय इंटरफेस को लागू .. बनाने इस मामले आप ओवरराइड करने के लिए compareTo() विधि की जरूरत में से एक वर्ग के उदाहरण की तुलना में सिर्फ एक ही रास्ता ..

यहाँ तुलनाकारी का उपयोग कर एक नमूना कोड संबद्ध कर सकते हैं: -

public class MyComparator implements Comparator<Box> { 
    @Override 
    public int compare(Box box0, Box box1) { 
     int w0 = box0.getWeight(); 
     int w1 = box1.getWeight(); 

     return (w0 > w1? -1 : (w0 == w1) ? 0 : 1); 
    } 
} 

public class Box { 
    private int weight; 

    public Box() {  
    } 

    public Box(int weight) { 
      this.weight = weight; 
    } 

    public int getWeight() { 
     return weight; 
    } 

    public void setWeight(int weight) { 
     this.weight = weight; 
    } 
} 

और अपने मुख्य

public class Main { 

    public static void main(String args[]) { 
     List<Box> boxList = new ArrayList<Box>(); 
     Collections.sort(boxList, new MyComparator()); 
    } 
} 

आशा है कि .. यह मदद करता है