2015-12-01 11 views
5

मेरे पास कुछ null मानों और कुछ तारों के साथ एक स्ट्रिंग सरणीसूची है। मैं सरणीसूची को सॉर्ट नहीं करना चाहता हूं लेकिन मुझे सरणी सूची को सॉर्ट करना चाहिए जैसे कि शून्य मान आखिरी बार आते हैं। आइए कहें कि सरणीसूची {1,2,null,6,5,null, 3} है, मुझे पिछले {1,2,6,5,3,null,null} पर शून्य मान प्राप्त करना चाहिए।स्ट्रिंग सॉर्टिंग शून्य मान

समाधान, मैं वर्तमान है: अभी, मैं नए ArrayList का निर्माण कर रहा हूँ और यदि मान null है, मैं इसे नई सूची में धक्का नहीं कर रहा हूँ अन्यथा मैं नए ArrayList में जोड़ने से कर रहा हूँ।

कोई अन्य बेहतर समाधान?

सहायता के लिए धन्यवाद।

+0

पोस्ट क्या तुम अब तक –

+5

बिल्ड अपनी खुद की * तुलनित्र * और सॉर्टर है कि पारित करने की कोशिश की की कोड: मामला समय में जटिलता चिंता का विषय है, तो आपको निम्न रेखीय समय समाधान (यथा-स्थान) का उपयोग कर सकते । – Bathsheba

+0

आपका दृष्टिकोण ठीक लगता है, क्योंकि आप वास्तव में सूची को सॉर्ट करना नहीं चाहते हैं। आप बस एक बार सूची में फिर से शुरू करें। यदि आप एक नई सूची बनाने के लिए पसंद करते हैं तो आप मूल सूची को संशोधित कर सकते हैं (जब भी आपको शून्य मान मिलती है, इसे हटा दें)। – Eran

उत्तर

0

नई सरणीसूची बनाने के बारे में क्या है और यदि यह वास्तविक मूल्य नई सूची में जोड़ता है और यदि यह एक शून्य वृद्धि काउंटर है। आखिरकार काउंटर वैल्यू के बराबर शून्य की संख्या जोड़ें।

8

आप जावा 8 का उपयोग कर रहे हैं, तो आप आसानी से तुलनित्र आप की जरूरत का निर्माण कर सकते हैं:

Arrays.sort(stringArray, Comparator.nullsLast(Comparator.naturalOrder())); 

लेकिन अगर आप जावा 8 का उपयोग नहीं आप की तरह नीचे

public class StringNullComparator implements Comparator<String> { 
    public int compare(String stringOne, String stringTwo) { 
     if (stringOne != null && stringTwo != null) 
      return stringOne.compareTo(stringTwo); 
     return (stringOne == stringTwo)?0:(stringOne==null? 1 : -1); 
    } 
} 

और आप एक तुलनित्र हो सकता है नीचे दिए गए

Arrays.sort(stringArray, new StringNullComparator()); 
1

पर उपयोग कर सकते हैं यदि आप पूरी सूची में स्पष्ट रूप से पुन: प्रयास करना चाहते हैं शून्य मानों को खोजने के लिए ArrayList.indexOf() का उपयोग कर सकते हैं, फिर उन्हें हटाएं। यदि आप सूची में मान रखना चाहते हैं तो आप सूची के अंत में केवल एक शून्य मान जोड़ सकते हैं। हालांकि मुझे लगता है कि यह दृष्टिकोण चिंता के मामले में महान नहीं है यदि यह चिंता का विषय है।

5

कस्टम तुलनाकारी सॉर्ट करने के लिए पारित करने के लिए:

public class StringComparator implements Comparator<String> { 
    public int compare(String s1, String s2) { 
     if (s1 != null && s2 != null) 
      return s1.compareTo(s2); 
     return (s1 == null) ? 1 : -1; 
    } 
} 
तो

:

Collectios.sort(list, new StringComparator()); 
0

आप समाप्त करने के लिए अशक्त सॉर्ट और गैर-शून्य तत्वों को इस Comparator कि क्या करना होगा के लिए आदेश रखना चाहते हैं:

class CompareStrings implements Comparator<String> { 

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

दोनों String अशक्त या गैर-शून्य कर रहे हैं वे करेंगे बराबर की तुलना करें। यदि केवल एक शून्य है तो यह गैर-शून्य से छोटी की तुलना करेगा।

0

कैसे के बारे में:

class MyInteger implements Comparator<Integer> { 
    public int compare(Integer arg0, Integer arg1) { 
     if(arg1 == null) { 
      return -1; 
     } 
     return 0; 
    } 
} 

और हम इसे पसंद का उपयोग कर सकते हैं:

List<Integer> al = new ArrayList<Integer>(); 
al.add(1); 
al.add(2); 
al.add(null); 
al.add(6); 
al.add(5); 
al.add(null); 
al.add(3); 

Collections.sort(al, new MyInteger()); 
0

अन्य सभी समाधान छंटाई शामिल है। जैसा कि आपने बताया है, आपको वास्तव में सॉर्टिंग की आवश्यकता नहीं है।

public static <T> void nullsToEndInPlace(List<T> l) { 
    int i = 0; 
    int j = l.size() - 1; 
    while (i < j) { 
     T left = l.get(i); 
     T right = l.get(j); 
     if (left != null) { 
     i++; 
     } else if (right == null) { 
     j--; 
     } else { 
     l.set(i, right); 
     l.set(j, null); 
     i++; 
     j--; 
     } 
    } 
    } 
संबंधित मुद्दे