2017-01-18 4 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()][]); 
} 

Однако я не могу управлять, чтобы удалить пустые значения. Он также удаляет только значения null из внутреннего массива.

У кого-нибудь есть лучшее решение?

+1

Вы забыли про ")": "if (internal [j]! = Null ||!" ". Equals (internal [j]))" –

+0

Что означает, удалив нулевое значение из массива? вы хотите изменить размер массива только на наличие допустимых объектов/значений? У вас либо есть значение в каком-то индексе, либо оно равно нулю в этом индексе. –

+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

Конечно нет, если вы занимите идеальное решение после того, как вы не указали, что вы привязаны к Java 7, который уже почти год закончился концом жизни. –

+0

Я не проголосовал за это, или я не собирался его проголосовать, я только что увидел его после того, как вы его упомянули, но вы правы, я забыл упомянуть об этом вначале. Thx очень много для вас, пытаясь сделать это в java 8 – NoName123

0

Вы не можете делать то, что вы описываете. Это невозможно.

Основываясь на приведенном вами описании и примере кода, кажется, что сам массив - это то, что вы хотите удалить из пустых или нулевых значений, и что ArrayList является лишь частью вашей попытки создания такого массива. Это процесс размышлений, который подсказывает мне мой ответ.

Когда вы создаете массив с длиной N (т. Е. Новый объект [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, каждый раз, когда вы «перенастраиваете» массив, он фактически выбрасывает массив, с которым вы работали, и создает новый, и на языках которые даже не требуют переназначения массива, но по-прежнему позволяют изменять его размер, эти языки обычно либо делают то же, что и Visual Basic, либо реализуют массивы языка как ArrayList (чтобы снова вернуть его на Java) ,

Смежные вопросы