Понимание OOP при итерации по LinkedList для задания - PullRequest
2 голосов
/ 09 июля 2020

Я до сих пор не могу понять, когда и почему мне следует использовать «Obj obj = new Obj», и я не понимаю, почему это так сложно для меня. В этом задании мне нужно создать следующий метод:

"insertSorted: этот метод предполагает, что входной LinkedList уже отсортирован в порядке убывания (т. Е. Так, что каждый элемент больше или равный тому, который находится перед ним, и вставляет входное значение int в правильное место списка. Обратите внимание, что метод ничего не возвращает, а скорее изменяет входной LinkedList в качестве побочного эффекта. Если входной LinkedList равен нулю, этот метод должен просто завершиться. Это код, с которого вы начинаете:

public static void insertSorted(LinkedList<Integer> list, int value) {

        /* IMPLEMENT THIS METHOD! */

    }

Не говоря уже обо всех сложностях, связанных с повторением списка LinkedList, я даже не знаю, с чего начать. Должен Я создаю новый LinkedList<Integer> newList = new LinkedList<Integer>();, чтобы я мог перебирать его правильно? Почему? Если список указан в сигнатуре метода, должен ли я предполагать, что объект уже создан, когда входные данные указаны в сигнатуре метода? Я действительно запутался . Похоже, я не могу понять все, что связано с объектным программированием.

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Поскольку метод возвращает void, вам следует изменить список, который предоставляется в качестве входных данных. Я покажу вам, почему на примере

public static void insertSorted(LinkedList<Integer> list, int value) {

    LinkedList<Integer> list2 = new LinkedList<Integer>(list); //this means you are creating a new list of integers called list 2 with the same elements of the list "list" in the same order
    //some code to add value to list2 maintaing the sorting
    //no return needed

}

где-то еще вы хотите вызвать этот метод

    LinkedList<Integer> list = new LinkedList<Integer>();

    list.Add(1);
    list.Add(2);
    list.Add(5);

    for (Integer i : list) System.out.println(i);
    //prints 1, 2 , 5
    insertSorted(list,4);
    for (Integer i : list) System.out.println(i);
    //still prints 1, 2 , 5!

, если теперь вы запускаете этот код с помощью отладчика и прерываете метод insertSorted сразу после того, как вы вставили значение в list2, вы увидите, что список «list» останется таким же, каким был в начале метода (который равен (1,2,5)), а список «list2» будет (1,2 , 4,5).

Но вызывающий метод ничего не знает о list2 !!!

Когда вы объявляете переменную в методе, она умирает, когда метод завершается (если вы ее не вернете). Конечно, вам следует обратить внимание на "псевдонимы", но это не так.

Ваши требования очень ясны: ваш метод должен изменять ввод, а не создавать новый список.

Вы не можете понять, почему вы должны создавать новый объект только потому, что вам это не нужно. Кто-то только что дал вам неправильное предложение :)

Теперь вам нужно перебрать список и вставить целое число в нужное место :)

0 голосов
/ 09 июля 2020
Obj obj = new Obj

ну, если вы хотите понять новое ключевое слово в одной строке, это похоже на контракт в области памяти, где вы можете хранить данные (это еще не все, но достаточно для начала).

public static void insertSorted(LinkedList<Integer> list, int value) {

    /* IMPLEMENT THIS METHOD! */

}

Теперь для этого метода вы не хотите создавать какие-либо новые объекты.

Q. Почему?

Ans - когда этот метод вызовет их, обязательно передать какой-либо параметр методу, если нет, он будет ошибка времени компиляции.

Передаваемые значения могут быть нулевыми.

...