2015-12-01 150 views
5

我有一些null價值觀和一些字符串一個字符串數組列表。我不想排列數組列表,但我應該對數組列表進行排序,以使空值最後出現。讓我們說的ArrayList是{1,2,null,6,5,null, 3},我應該得到最後{1,2,6,5,3,null,null}空值。字符串排序空值

解決方案,我目前有: 現在,我正在構建新的ArrayList和如果值是null,我不是推到新的列表,否則我將它添加到新的數組列表。

任何其他更好的解決辦法?

感謝您的幫助。

+0

後的你試過到目前爲止 –

+5

構建自己的*比較*,並傳遞到分揀機什麼碼。 – Bathsheba

+0

你的方法看起來很好,因爲你不想實際排序列表。你只需遍歷列表一次。如果您更喜歡創建新列表(每當遇到空值時將其刪除),則可以修改原始列表。 – Eran

回答

0

關於建造新的ArrayList,如果它真正的價值它添加到新的列表,如果它是一個空增量counter.At最後加空等於計數器值的數是什麼。

8

如果您使用的是Java 8,你可以很容易地建立你所需要的比較:

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

但是,如果你不使用Java 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

如果要排序空至年底,並維持秩序的非null元素此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--; 
     } 
    } 
    }