Удалить ссылку на последний элемент массива после удаления элемента массива

320
01 декабря 2021, 15:20

У меня есть следующий метод, который удаляет элемент массива объектов:

public IPerson delete(int index) {

   int size2 = mass.length - 1;
    IPerson[] mass2 = new IPerson[size2];
    System.arraycopy(mass, 0, mass2, 0, index);
    System.arraycopy(mass, index + 1, mass2, index,
            mass.length - index - 1);
    mass = new IPerson[size2];
    System.arraycopy(mass2, 0, mass, 0, size2);
    mass[index+1]=null;
    return mass[index];
}

Но преподаватель говорит,что в конце необходимо обнулить ссылку на последний элемент массива.Но как это сделать я не знаю.Подскажите пожалуйста как это сделать. Вот код класса Repository(в котором находится метод delete ): package com.mycompany.laba1;

import java.time.format.DateTimeFormatter;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import sun.security.util.Length;
import org.joda.time.format.*;
import java.io.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.function.Predicate;
import java.util.Optional;
/**
 * Class Repository is intended for store objects class IPerson.
 *
 *
 * @author Data
 */
public class Repository implements IRepository {
    /**
     * Field size store size massiv.
     */
    private int size;
    private IPerson[] mass;
    private int count = 0;
    /**
     * This is constructor. In constructor we initialize property size and array
     * mass of type IPerson
     *
     *
     * @author Data
     * @param size
     */
    public Repository(int size) {
        this.size = size;
        mass = new IPerson[size];
    }
    /**
     * Method setSize set size.
     *
     * @param size
     */
    public final void setSize(int size) {
        this.size = size;
    }
    /**
     * Method getSize return size.
     *
     * @return
     */
    public final int getSize() {
        return size;
    }
    /**
     * Method add -add Object into array mass.
     *
     */
    public void add(IPerson person) {
        /* if (count == size)
        {
        int currentCapacity = mass.length;
        IPerson[] tempArr = new IPerson[currentCapacity + currentCapacity];
        for(int i = 0; i < mass.length; i++) {
            tempArr[i] = mass[i];
        }
        mass = tempArr;
        }*/
        int firstLength = mass.length;
        for (int i = 0; i < mass.length; i++) {
            if (mass[i] != null && i == mass.length - 1) {
                int currentCapacity = mass.length;
                IPerson[] tempArr = new IPerson[currentCapacity * 2];
                for (int j = 0; j < currentCapacity; j++) {
                    tempArr[j] = mass[j];
                }
                // mass = new IPerson[tempArr.length];
                mass = tempArr;
                //    mass[currentCapacity]=obj;
                //   break;
            }
            if (mass[i] == null) {
                mass[i] = person;
                break;
            }
        }
        //else
    }
    /**
     * Method add -add Object into array mass, if element mass[index] is null.
     *
     */
    public void add(int index, IPerson person) {
        if (mass[index] == null) {
            mass[index] = person;
        } else //throw new Exception("This index contains element");
        {
            Optional.of("This index contains element");
        }
    }
    /**
     * Method set -replace element array "mas" with "index" for object "person".
     *
     * @param index
     * @param person
     */
    public IPerson set(int index, IPerson person) {
        mass[index] = person;
        return person;
    }
    /**
     * Method get -return element array "mass" for given "index".
     *
     */
    public IPerson get(int index) {
        return mass[index];
    }
    /**
     * Method toList -convert array "mass" to Collection "List".
     *
     */
    public List<IPerson> toList() {
        ArrayList<IPerson> arr = new ArrayList<>();
        for (int i = 0; i < mass.length; i++) {
            if (mass[i] != null) {
                arr.add(mass[i]);
            }
        }
        return arr;
    }
    /**
     * Method delete(int index) receive index element massiv and delete this
     * element.
     *
     * @param index
     */
    public IPerson delete(int index) {
       int size2 = mass.length - 1;
        IPerson[] mass2 = new IPerson[size2];
        System.arraycopy(mass, 0, mass2, 0, index);
        System.arraycopy(mass, index + 1, mass2, index,
                mass.length - index - 1);
        //   count--;
        mass = new IPerson[size2];
        System.arraycopy(mass2, 0, mass, 0, size2);
        mass[index+1]=null;
     /*  for (int i = index; i < mass.length-1; i++)
        {
            mass[i] = mass[i + 1];
        }
        int[] newArr = new int[mass.length - 1];
        System.arraycopy(mass, 0, newArr, 0, mass.length - 1);*/
        return mass[index];
    }
    /**
     * Method getMass - return array "mass"
     *
     */
    public IPerson[] getMass() {
        int countNotNullElement = 0;
        for (int i = 0; i < mass.length; i++) {
            if (mass[i] != null) {
                countNotNullElement++;
            }
        }
        int currentIndex = 0;
        IPerson[] mass2 = new IPerson[countNotNullElement];
        for (int i = 0; i < mass.length; i++) {
            if (mass[i] != null) {
                mass2[currentIndex++] = mass[i];
            }
        }
        // mass=mass2;
        return mass2;
    }
    /**
     * Method readFromFileInRepository - read file and add to array "mass" with
     * method add(IPerson obj)
     *
     * @param fileName
     */
    /**
     * Method SortBy-sort array "mass" with given comparator
     *
     * @param comparator
     */
    public void sortBy(Comparator<IPerson> comparator) {
        Arrays.sort(mass, comparator);
    }
     public void bubbleSort(Comparator<IPerson> comparator) {
        for (int i = 0; i < mass.length; i++) {
                    for (int j = mass.length-1 ; j > i; j--) {
                        if (comparator.compare(mass[j-1], mass[j])>0) {
                            IPerson buf = mass[j - 1];
                            mass[j - 1] = mass[j];
                            mass[j] = buf;
                        }
                    }
                }
    }
      public void insertionSort(Comparator<IPerson> comparator) {
       IPerson temp;
                int item;
                for (int counter = 1; counter < mass.length; counter++) {
                    temp = mass[counter];
                    item = counter - 1;
                    while (item >= 0 && comparator.compare(mass[item], temp)>0) {
                        mass[item + 1] = mass[item];
                        mass[item] = temp;
                        item--;
                    }
                }
    }

    public IRepository searchBy(Predicate<IPerson> condition) {
        IRepository buf = new Repository(size);
         IDivision div = new Division("A");
        IDivision div2 = new Division("B");
        IDivision div3 = new Division("C");
        // System.out.println("Hello World");
        LocalDate localDate1 = LocalDate.of(1960, Month.MAY, 14);
        LocalDate localDate2 = LocalDate.of(1965, Month.MAY, 14);
        LocalDate localDate3 = LocalDate.of(1970, Month.MAY, 14);
        BigDecimal bd = new BigDecimal(20000);
        BigDecimal bd2 = new BigDecimal(25000);
        BigDecimal bd3 = new BigDecimal(35000);
        IPerson p1 = new Person(1, "Valeriy", "Petrov",Gender.MALE, localDate1,  div, bd);
        IPerson p2 = new Person(5, "Valeriy", "Petrov",Gender.MALE, localDate1,  div, bd);
        IPerson p3 = new Person(6, "Valeriy", "Petrov",Gender.MALE, localDate1,  div2, bd);
        IPerson p4 = new Person(7, "Valeriy", "Petrov",  Gender.MALE,localDate2, div, bd);
        IPerson p5 = new Person(8, "Valeriy", "Petrov", Gender.MALE,localDate1,  div, bd);
        IPerson p6 = new Person(9, "Vera", "Petrova",Gender.FEMALE, localDate1,  div3, bd2);
        IPerson p7 = new Person(10, "Ivan", "Ivanov", Gender.MALE,localDate3,  div, bd);
        IPerson p8 = new Person(0, "Vladimir", "Smirnov",Gender.MALE, localDate1,  div, bd3);
        buf.add(p1);
        buf.add(p2);
        buf.add(p3);
        buf.add(p4);

        for (int i = 0; i < buf.toList().size(); i++) {
            if (condition.test(mass[i])) {
                return buf;
            }
        }
        return buf;
    }
}
Answer 1

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

Сейчас Вы пытаетесь при удалении элемента сразу уменьшить размер массива.

Было  (count 4 size 4): {Алиса, Боря, Вася, Гена}
Стало (count 3 size 3): {Алиса, Боря, Гена}

В этом случае уже ничего обнулять не нужно. Элемента больше нет. Даже вот это Ваше mass[index+1]=null; по-моему лишнее.

При таком понимании неясно зачем нужны разные значения count (количество элементов) и size (размер массива).

Полагаю, что правильным является другое понимание. Размер массива должен изменяться редко, только в случае если не хватает элементов для расширения. При удалении размер массива изменяться вообще не должен. Вместо этого должно произойти следующее:

  • последующие элементы сдвигается на место этого элемента, при этом фактически происходит удаление;
  • количество элементов уменьшается;
  • ссылка на «бывший» последний элемент обнуляется, чтобы не хранить лишнее и освободить элемент для сборщика мусора.

Тогда получим, что count изменяется независимо от size:

Было  (count 4 size 4): {Алиса, Боря, Вася, Гена}
Стало (count 3 size 4): {Алиса, Боря, Гена, null}

Так можно удалить элемент и при этом сэкономить на создании новых массивов при каждом удалении.

За образец можно взять исходный код класса ArrayList, который работает по похожему принципу.

Основываясь на коде метода ArrayList.remove пишем код. Непонятно, что должен возвращать delete предположу, что удаленный элемент. Получается примерно следующее (не тестировал):

public IPerson delete(int index) {
    //хорошо бы предварительно проверить индекс (>=0 и <count)
    //сохраняем удаленный элемент
    IPerson oldValue = mass[index];
    //сдвигаем последующие элементы, если они есть
    int numMoved = count - index - 1;
    if (numMoved > 0) {
            System.arraycopy(mass, index+1, mass, index, numMoved);
    }
    //обнуляем последний элемент
    mass[--count] = null; 
    return oldValue;
}

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

P.S. Повторюсь, что за расхождения моей трактовки задания с трактовкой преподавателя я ответственности не несу. Вполне может быть что он имел ввиду нечто другое, поэтому требования лучше уточнять как можно подробнее.

READ ALSO
Как массиву или переменной назначить другой массив по ссылке? JAVA создание таблицы

Как массиву или переменной назначить другой массив по ссылке? JAVA создание таблицы

Начал изучать java и столкнулся с проблемой не получается сделать таблицу

260
Поменять столбцы местами в матрице

Поменять столбцы местами в матрице

При работе с матрицами, а именно с двумерным массивом назовем его int[][]a для замены строк мы можем сделать так:

172
В чем причина ошибки &quot;cannot find symbol&quot; [закрыт]

В чем причина ошибки "cannot find symbol" [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

218
Почему родительский блок меняет свой размер с :hover?

Почему родительский блок меняет свой размер с :hover?

у меня присутствует ховер, который добавляет линию подчеркивания под объектом]2

149