2015-12-01 9 views
5

私は文字列配列を持っていて、一部の文字はnullです。私はarraylistを並べ替えたいとは思わないが、null値が最後に来るようにarraylistをソートする必要があります。 arraylistは{1,2,null,6,5,null, 3}で、最後にヌル値{1,2,6,5,3,null,null}を得なければならないと言うことができます。ヌル値をソートする文字列

ソリューションは、私が現在持っている: を今、私は新しいのArrayListを構築していますし、値がnullであれば、私はそうでない場合、私は新しいのArrayListに追加しています新しいリストにそれを押していません。

その他の解決策はありますか?

ありがとうございました。

+0

あなたは –

+5

独自*コンパレータ*を構築し、ソーターにそれを渡し、これまで試したもののコードを投稿します。 – Bathsheba

+0

実際にリストをソートしたくないので、あなたのアプローチはうまくいくようです。リストを一度反復するだけです。新しいリストを作成するよりも(元のリストにnull値が出てきたときはいつでも)元のリストを変更することができます。 – Eran

答えて

0

新しいarraylistを構築するのはどうですか?それが本当の値であれば新しいリストに追加し、NULLの場合はカウンタを増やします。最後にカウンタの値に等しいnullの数を加算します。

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()を使用してヌル値を見つけ、それらを削除()することができます。リスト内の値を保持したい場合は、リストの末尾にnull値を追加することができます。しかし、これが懸念されている場合、このアプローチはパフォーマンス面ではあまり良くないと思います。

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; 
    } 
} 

:あなたはNullComparator from apacheを使用することができます

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

Collections.sort(list, new NullComparator()); 
0

あなたが最後にnullを並べ替えると、このComparatorはそれを行うだろうnullでない要素のための順序を保持する場合:

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がnullか非nullの場合、彼らは意志等しいと比較する。一方がnullの場合、null以外の値と比較されます。

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--; 
     } 
    } 
    }