4

- のように、5 つのスペースを含む配列を作成するとしますString[] myArray = new String[5]。次に、これらの項目のいくつかを定義し、そのうちのいくつかを null (または未定義の配列項目/変数を表す Java 用語) のままにするとします。次のようになります。

myArray[0] = "foo";
myArray[2] = "bar";
myArray[4] = "foobar";

その配列を「縮小」して、すべての null 項目を絞り出す (サイズを変更しない) 方法はありますか? 「foo」のインデックスは 0 のままですが、「bar」のインデックスは 1 になり、「foobar」は 2 に存在し、最後の 2 つのスペースは空ですか? 簡単に言うと、配列内のアイテムをシャッフルし、他のアイテムの相対的な順序を維持しながら、すべての null アイテムを最後にプッシュします。そのための事前定義された Java メソッドは既にありますか、それとも独自に作成する必要がありますか?

4

6 に答える 6

5

次のアプローチを使用できます(Collections インスタンスのオーバーヘッドなし):

import java.util.Arrays;

public class ArraySample {

    public static void main(final String[] args) {
        String[] src = new String[] { "foo", null, "bar", null, "foobar" };
        String[] dest = new String[src.length];

        int i = 0;
        for (String s : src) {
            if (s != null) {
                dest[i++] = s;
            }
        }

        System.out.println(Arrays.toString(src));
        System.out.println(Arrays.toString(dest));
    }

}
于 2012-06-24T09:54:31.660 に答える
5

ソース配列のみでそれを行うことができます:

    String[] src = new String[] { "foo", "foo3", null,null, "bar", null,null, "foobar", "foo2", null,"foo5",null };
    int lastNullIdx = -1;

    for (int i=0; i <src.length ; i++) {
        if (src[i] == null) {
            if(lastNullIdx==-1)lastNullIdx=i;
        }
        else if(lastNullIdx!=-1){
            src[lastNullIdx++]=src[i];
            src[i]=null;
        }
    }

    System.out.println(Arrays.toString(src));
于 2012-06-24T10:12:17.940 に答える
1

そのための方法があるとは思わないでください。rerewがそのようなものである場合、それはjava.util.Arraysにあります。私はこのようにします

String[] src = new String[] { "foo", null, "bar", null, "foobar" };

for (int c = 0, j = 0; c < src.length; c++) {
    if (src[c] != null) {
        src[j++] = src[c];
        src[c] = null;
    }
}

編集:

String[] src = new String[] { "foo", null, "bar", null, "foobar" };
Comparator<String> NEW_ORDER = new Comparator<String>() {
    public int compare(String e1, String e2) {
        if(e1 == null)return 1;
        if(e2 == null)return -1;
        return 0;
    }
Arrays.sort(src, NEW_ORDER);

Arrays.sortは安定したソートであるため、同様に機能するはずですが、O(n log n)ではなくO(n)であるため、他のソリューションの方が優れていると思います。

于 2012-06-24T10:32:40.267 に答える
1

インプレース縮小、より単純なコード:

public static String[] minify(String[] x) {
  int d = 0;
  for (String s : x) if (s != null) x[d++] = s;
  while (d < x.length) x[d++] = null;
  return x;
}

public static void main(String[] args) {
  System.out.println(Arrays.toString(
      minify(new String[] {"foo", null, "bar", null, "foobar"})));
}
于 2012-06-24T10:37:27.937 に答える
1

Functionaljava を使用すると、

array(myArray).filter(new F<String, Boolean>() {
  public Boolean f(String s) { 
    return s != null; 
  }
});

これにより、指定された条件を満たす要素が保持されます。結果は、によって返される新しい配列になりますfilter

編集:

すみません、前の質問を読み違えました。nulls を右に押し出す方法は次のとおりです。

array(myArray).sort(
  booleanOrd.comap(new F<String, Boolean>() {
    public Boolean f(String s) {
      return s == null;
    }
  })
);
于 2012-06-24T10:40:14.170 に答える
0

Java は、Arrays.sort(T[] a, Comparator c) メソッドを使用して、このような並べ替えの問題に対して既に準備されています。

Arrays.sort(myArray, new StringNullComparator());

class StringNullComparator implements Comparator<String> {

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

このようにして、compare メソッドから返された値を反転することで、null 値を下位のインデックスに並べ替えることもできます。

于 2012-06-24T11:06:42.957 に答える