Как сделать, чтобы подсписок ссылался на его оригинальный ArrayList? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть домашнее задание, которое нужно выполнить в java, о типах ArrayList и Generics.

У меня есть 2 класса: -> CoupeDeA -> TableauPartiel

CoupeDeA - просто описатель, откуда и кудамассив вырезан.(Он содержит только две частные целочисленные переменные «начало» и «конец»)

TableauPartiel - это класс, в котором находится ArrayList.

Моя проблема заключается в том, что мне нужно создать метод в TableauPartiel следующим образом:

public TableauPartiel<E> coupe(CoupeDeA coupe)

И возвращаемый TableauPartiel должен быть ссылкой на мой начальный TableauPartiel.Пример:

Integer[] arr = {8,7,6,5};
TableauPartiel<E> tab = new TableauPartiel<>(arr);

TableauPartiel<E> tab2 = tab.coupe(1,3);
tab2.set(1,45);

Предполагается, что этот код устанавливает 45 на индекс 1 моего tab2 и одновременно устанавливает 45 на индекс 2.

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

Например, я попробовал что-то вроде этого:

private ArrayList<E> tableau;
...
public TableauPartiel<E> coupe(Coupe coupe)
            throws IndexOutOfBoundsException {
    if (coupe.getBegin() >= 0 && coupe.getEnd() <= tableau.size()) {

        TableauPartiel<E> tab = new TableauPartiel<>((E[]) new Object[coupe.getEnd()-coupe.getBegin()]);

        for (int i = 0; i < coupe.getEnd()-coupe.getBegin(); ++i) {
            tab.set(i, this.get(coupe.getBegin()+i));
        }

        return tab;

    } else {
        throw new IndexOutOfBoundsException();
    }
}

Как я могу получить список, который ссылается наего оригинальный ArrayList?

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

TableauPartiel<E> tab;

if (coupe.getDebut() >= 0 && coupe.getFin() <= taille()) {
    if (coupe.getFin() == -1)
        tab = new TableauPartiel<>(tableau.subList(coupe.getDebut(),taille()));
    else
        tab = new TableauPartiel<>(tableau.subList(coupe.getDebut(),coupe.getFin()));

     return tab;
    } else {
    throw new IndexOutOfBoundsException();
    }
}

1 Ответ

0 голосов
/ 11 февраля 2019

Сначала несколько мелких вещей:

  • придерживайтесь английских слов в вашем коде.Особенно в именах классов, функций, переменных и т. Д. - имена должны раскрывать намерения (без Google Translate).Лучше не приобретать вредную привычку, позволяя себе поступить иначе.
  • Я не уверен, как ваши Coupe будут работать (это 0 допустимое минимальное число или 1?), Но coupe.getEnd() <= tableau.size() может выйти из-под контроля

Теперь мое предложение для решения:

Я предлагаю вам изменить класс TableauPartiel, чтобы иметь целочисленные поля start и end вдополнение к private ArrayList<E> tableau; ссылке у вас уже есть.Возможно, добавьте новый «конструктор копирования», принимающий экземпляр TableauPartiel (из которого вы можете скопировать ссылку на tableau) и два значения int, указывающие, какую часть оригинала tableau вы можете использовать (трюк здесьтакже посмотрите на start и end значения объекта, из которого вы 'подстраиваете').Таким образом, когда вы звоните #coupe, вы можете проверить правильность введенных номеров (как вы уже это делаете) и просто вернуть новый объект TableauPartiel со ссылкой на this и параметрами метода - start иend значений.Добавьте логику манипулирования индексами, используя эти start и end, к любым методам, которые есть у вашего TableauPartiel, и вам будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...