Я хочу удалить нулевые элементы в списке массивов, что должно уменьшить размер массива

#java #oop #junit5

#java #ооп #junit5

Вопрос:

Это мой метод удаления количества нулевых элементов:

 @Override
public void removeAt(int index) {
    int count = 0;
    for(int i = index; i < this.array.length -1; i  ){
        array[i] = array[i   1];
        if(Arrays.toString(array).contains("null")) {
            count = count   1;
            System.out.println("the number of null it has is "   count);
        }
        }
    System.out.println(Arrays.toString(array));
      }
  

Это мой тест для метода RemoveAt:

 @Test
@DisplayName("remove at index 0, then check size, went from 11 to 10")
void t8_removeAt() { 
    MutableArray<String> ma = new MutableArray<String>();
    
    //add 11 items to the array
    for(int i = 0; i < 11; i  ) {
        ma.append("number_"   i);
    }
    
    //delete element 0
    ma.removeAt(1);
    
    int actual = ma.size();
    int expected = 10;
    
    assertEquals(expected, actual);
}
  

Это результат:

 the number of null it has is 1
the number of null it has is 2
the number of null it has is 3
the number of null it has is 4
the number of null it has is 5
the number of null it has is 6
the number of null it has is 7
the number of null it has is 8
the number of null it has is 9
the number of null it has is 10
the number of null it has is 11
the number of null it has is 12
the number of null it has is 13
the number of null it has is 14
the number of null it has is 15
the number of null it has is 16
the number of null it has is 17
the number of null it has is 18
[number_0, number_2, number_3, number_4, number_5, number_6, number_7, number_8, number_9, number_10, null, null, null, null, null, null, null, null, null, null]
  

Ответ №1:

Вы не уменьшаете свою внутреннюю array переменную, поэтому ее размер не меняется. На самом деле вы даже не удаляете элементы из своего списка, а просто сдвигаете все элементы вправо от нулевого элемента, что, я думаю, не то, что ожидалось.

Ответ №2:

Я не вижу в вашем коде ни одного оператора, который мог бы удалить null элемент из массива. Простым решением является преобразование данного массива в an ArrayList , а затем использование an Iterator для итерации ArrayList и удаления null элементов. Как только вы закончите с удалением null элементов, преобразуйте ArrayList их обратно в массив.

 import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Original array
        String[] array = { "a", "b", null, "c", null, null, "d" };
        int originalSize = array.length;

        // Delete null elements
        List<String> list = new ArrayList<>(Arrays.asList(array));
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            if (itr.next() == null) {
                itr.remove();
            }
        }

        // Convert list to array and assign it to original array reference
        array = list.toArray(new String[0]);
        System.out.println(Arrays.toString(array));
        System.out.println("Number of null elements deleted: "   (originalSize - array.length));
    }
}
  

Вывод:

 [a, b, c, d]
Number of null elements deleted: 3