2017-01-18 184 views
-1

我有一個object[][]和內部和外部數組包含null或空值。java multidimensional array刪除空/空元素

我需要刪除這些數組中的所有空值和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()][]); 
} 

但我不能設法刪除空值。它也僅從內部數組中刪除null值。

有沒有人有更好的解決方案?

+1

你忘了「)」:「if(inner [j]!= null ||!」「。equals(inner [j]))」 –

+0

從數組中刪除空值是什麼意思?你想調整數組的大小來僅包含有效的對象/值嗎?您在某個索引處有值,或者在該索引處爲空。 –

+1

其中數組是在您的代碼中定義/創建的?它似乎是這整個代碼背後的驅動力... –

回答

0

根據您需要處理的元素數量,您可能需要使用Java 8的fork連接池。如果沒有,刪除.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

當然,如果你失敗了,之後沒有說明你已經註冊Java 7了,現在已經有將近一年的時間了。 –

+0

我沒有把它投下來,或者我不打算把它投下來,我剛剛提到它之後就看到了它,但你說得對,我在開始時忘了提及它。 Thx非常適合你在java中的工作8 – NoName123

0

你不能做你的描述。這不可能。

根據您給出的描述和示例代碼,看起來數組本身就是您想要從中移除所有空值或空值並且ArrayList僅僅是您嘗試創建此類數組的一部分。這是提示我回答的思考過程。

當您創建長度爲N的數組(即:new Object [N])時,該數組最初爲「空」,因爲它包含N個空值。例如:new Object[3]提供了陣列{null, null, null}。你不能刪除這些空值,數組的工作方式「去除」甚至沒有意義。

使用上面的new Object[3]示例,假設您想要移除元素array[1];刪除空值後,您希望在array[1]中剩下什麼? null基本上在那個地方現貨是空的。你希望刪除array[1]會給你一個2個元素而不是3個數組嗎?數組不以這種方式工作。如果你想要這種行爲,那麼你需要堅持一個ArrayList而不是一個數組。

如果你想去除的array[1]您留下長度爲2的數組,然後簡單地讓你的輸入和輸出,以你的方法是一個ArrayList和完全不使用數組。這樣做而不是輸入數組的當前代碼,將其轉換爲ArrayList,然後將其轉換回數組。

數組的長度是恆定的。一旦數組被創建,它就有一組數量的元素,並且該數字不能被改變。許多編程語言都是如此。例如,C++的工作原理是一樣的。如果您對數組的誤解是因爲您來自另一種語言,請了解,在每次「重新規劃」數組時,它都會拋出您正在使用的數組並創建一個新數組,並以語言它們甚至不需要重新定義數組,但仍然允許您更改其大小,這些語言通常與Visual Basic做同樣的事情,或者將語言的數組作爲ArrayList實現(將其重新轉換爲Java術語) 。