2017-01-18 38 views
-1

私はobject[][]を持ち、内側と外側の配列にはnullまたは空の値が含まれています。Java多次元配列が空/ヌル要素を削除する

これらの配列からすべての空の値とnullの値を削除する必要があります。

public static void Compact(object[][] array) 
{ 
    List<Object[]> outerList = new ArrayList<Object[]>(array.length); 
    for(int i = 0; i < array.length; i++) { 
     Object[] inner = array[i]; 
     if (inner != null) { 
      List<Object> list = new ArrayList<Object>(inner.length); 
      for(int j=0; j < inner.length; j++){ 
       if(inner[j] != null || !"".equals(inner[j])){ 
        list.add(inner[j]); 
       } 
      } 
      outerList.add(list.toArray(new Object[list.size()])); 
     } 
    } 
    array = outerList.toArray(new Object[outerList.size()][]); 
} 

しかし、私は空の値を削除するために管理することはできません。

Iは、例えば、私は別のスタックオーバーフロー後から変更この溶液をいくつかのソリューションを試みました。また、内部配列からnull値だけを削除します。

誰かがより良い解決策を持っていますか?

+1

"(int [j]!= null ||!" "。equals(inner [j])") " –

+0

どうすれば配列からヌル値を削除するのですか?有効なオブジェクト/値のみを含むように配列のサイズを変更しますか?いくつかのインデックスに値があるか、そのインデックスにnullがあります。 –

+1

ここで、あなたのコードで配列が定義/作成されていますか?それはこのコード全体の原動力と思われる... –

答えて

0

処理する必要のある要素の数に応じて、Java 8のフォーク結合プールを使用することができます。ない場合は、次のコード例では.parallel()を削除します。

import java.util.List; 
import java.util.Objects; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

public class Compact { 

    public static void main(String[] args) { 
    Object[][] objects = { 
     new Object[]{"Hello", null, null, "World"}, 
     new Object[]{null, null, ""}, 
     new Object[]{}, 
     null, 
     new Object[]{new Object()}, 
     new Object[]{"Hello", "StackOverflow", null}, 
    }; 

    List<List<Object>> result = compact(objects); 
    System.out.println(result); 
    } 

    private static List<List<Object>> compact(Object[][] array) { 
    return Stream.of(array).parallel() 
     // Ignore null objects of the outer array 
     .filter(Objects::nonNull) 
     // Process all inner arrays 
     .map(inner -> Stream.of(inner).parallel() 
     // Ignore null objects or empty strings 
     .filter(element -> element != null && !"".equals(element)) 
     // Collect what is left 
     .collect(Collectors.toList())) 
     // From the result above, ignore all empty arrays 
     .filter(inner -> !inner.isEmpty()) 
     // Collect what is left 
     .collect(Collectors.toList()); 
    } 
} 

出力:

[[Hello, World], [[email protected]], [Hello, StackOverflow]] 
+0

thxですが、私は自分のプロジェクトでjava 8を使用できません。したがって、java 8のコードを書くことはありません。私はあなたがJava 7でコーディングすることができればそれを感謝します(もちろん、あまりにも複雑で時間のかかるものではない場合)...私はそれを理解してJava 7で書くようになります – NoName123

+0

確かにあなたは完全に微細な解決策をdownvoteあなたがJava 7に縛られていることを指定していないのですが、これは現在ではほぼ1年が終わっています。 –

+0

私はそれを投票しなかった、または投票するつもりはなかった、あなたがそれに言及した直後にそれを見たが、あなたが正しい、私は最初にそれを言及するのを忘れてしまった。 Thx非常にJava 8でそれをやっている努力のため – NoName123

0

をあなたは説明何することはできません。それは不可能。

与えられた説明とサンプルコードに基づいて、配列自体が空の値またはnull値をすべて削除しているように見え、ArrayListはそのような配列を作成しようとする試みの一部に過ぎません。それが私の答えを促す思考プロセスです。

長さNの配列(new Object [N])を作成すると、その配列はN個のNULL値を含む点で最初は "空"です。例:new Object[3]は配列{null, null, null}を提供します。これらのヌル値を削除することはできませんし、配列の仕組みは「削除」も実際には意味がありません。

new Object[3]という上記の例を使用して、要素array[1]を削除するとします。ヌル値を削除した後、array[1]に何が残ると思われますか?その場所にはnullが基本的にスポットが空です。 array[1]を削除すると、3の代わりに2つの要素の配列が残ることを願っていますか?配列はそのようには機能しません。その動作が必要な場合は、配列の代わりにArrayListを使用する必要があります。

array[1]を削除して長さ2の配列を残す場合は、メソッドへの入力と出力をArrayListにして、配列をまったく使用しないでください。現在のコードではなく、配列を入力してArrayListに変換し、それを配列に変換し直します。

配列の長さは一定です。配列が作成されると、要素数が設定され、その数は変更できません。これは多くのプログラミング言語に当てはまります。例えば、C++は同じ働きをします。配列の誤解は、あなたが出てくる別の言語のためであれば、配列を "再サイズ変更"するたびにVisual Basicのような場合には、実際に作業していた配列をスローして新しい配列を作成し、配列のサイズを変更する必要はありませんが、サイズを変更することはできますが、これらの言語は一般にVisual Basicと同じことを行うか、言語配列をArrayListとして実装します(Java用語に戻すため) 。

関連する問題