我有一些null
價值觀和一些字符串一個字符串數組列表。我不想排列數組列表,但我應該對數組列表進行排序,以使空值最後出現。讓我們說的ArrayList是{1,2,null,6,5,null, 3}
,我應該得到最後{1,2,6,5,3,null,null}
空值。字符串排序空值
解決方案,我目前有: 現在,我正在構建新的ArrayList和如果值是null
,我不是推到新的列表,否則我將它添加到新的數組列表。
任何其他更好的解決辦法?
感謝您的幫助。
我有一些null
價值觀和一些字符串一個字符串數組列表。我不想排列數組列表,但我應該對數組列表進行排序,以使空值最後出現。讓我們說的ArrayList是{1,2,null,6,5,null, 3}
,我應該得到最後{1,2,6,5,3,null,null}
空值。字符串排序空值
解決方案,我目前有: 現在,我正在構建新的ArrayList和如果值是null
,我不是推到新的列表,否則我將它添加到新的數組列表。
任何其他更好的解決辦法?
感謝您的幫助。
關於建造新的ArrayList,如果它真正的價值它添加到新的列表,如果它是一個空增量counter.At最後加空等於計數器值的數是什麼。
如果您使用的是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());
如果你想避免顯式迭代整個列表你可以使用ArrayList.indexOf()來查找空值,然後刪除()它們。如果你想保留值列表,你可以不只是一個空值添加到列表的末尾。不過,如果這是一個問題,我會想象這種方法在性能方面不是很好。
自定義比較傳遞給排序:
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());
您可以使用NullComparator from apache。
Collections.sort(list, new NullComparator());
如果要排序空至年底,並維持秩序的非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
是空還是非空,他們會比較相等。如果只有一個是空的,它會比非空的比較小。
如何:
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());
所有其他解決方案涉及的排序。正如你所提到的,你並不需要排序。如果時間複雜度是一個問題,你可以使用(就地)下面的線性時間的解決方案:
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--;
}
}
}
後的你試過到目前爲止 –
構建自己的*比較*,並傳遞到分揀機什麼碼。 – Bathsheba
你的方法看起來很好,因爲你不想實際排序列表。你只需遍歷列表一次。如果您更喜歡創建新列表(每當遇到空值時將其刪除),則可以修改原始列表。 – Eran