Софтуерно Инженерство
Loading...
+ Нов въпрос
KaloyanStoyanovvv avatar KaloyanStoyanovvv 20 Точки

ListManipulationBasics problem Tech Module

Здравейте, следният код ми дава 80/100 https://pastebin.com/UyCegRLc ,като се има предвид че съм го копирал от Lab-a. Разбира се преди това пробвах с мое решение, направено с if-ове, но общо взето същата логика и пак 80/100... Някой ако може да сподели къде се губят 20-те точки?

Условието на задачата е:

Write a program that reads a list of integers. Then until you receive "end", you will be given different commands:

Add {number}: add a number to the end of the list

Remove {number}: remove number from the list

RemoveAt {index}: removes number at a given index

Insert {number} {index}: inserts a number at a given index

Note: All the indices will be valid!

When you receive the "end" command print the final state of the list (separated by spaces)

Input:

4 19 2 53 6 43

Add 3

Remove 2

RemoveAt 1

Insert 8 3

end

Output:

4 53 6 8 43 3

Тагове:
0
Technology Fundamentals 12/01/2019 09:10:46
MartinBG avatar MartinBG 1042 Точки

"Remove" не работи, както очакваш.

Много коварен бъг, а като гледам го има и в материалите към тази задача laugh

 

                case "Remove":
                    int numberToRemove = Integer.parseInt(commandArr[1]);
                    numbers.remove(numberToRemove);
                    break;
                case "RemoveAt":
                    int indexToRemove = Integer.parseInt(commandArr[1]);
                    numbers.remove(indexToRemove);
                    break;

 

Единствената разлика в кода между двете операции е в името на променливата. Реално и двете извикват овърлоуда на remove(int index), вместо първата да извика remove(Object):

remove​(int index)
Removes the element at the specified position in this list (optional operation). Shifts any subsequent elements to the left (subtracts one from their indices). Returns the element that was removed from the list.
 

boolean remove​(Object o)
Removes the first occurrence of the specified element from this list, if it is present (optional operation). If this list does not contain the element, it is unchanged. More formally, removes the element with the lowest index i such that Objects.equals(o, get(i)) (if such an element exists). Returns true if this list contained the specified element (or equivalently, if this list changed as a result of the call).

 

Ако промениш колекцията от List<Integer> на List<String>, ще може с минимални корекции по кода да вземеш точките в Judge -

фикс.

1
12/01/2019 12:36:25
KaloyanStoyanovvv avatar KaloyanStoyanovvv 20 Точки

Благодаря за отговора. Малко ми е неясно защо взето като стринг работи, а като число не, а и също така си мислех че toString принта ще се погрижи да дава финалния резултат както трябва, но явно че не е точно така?

0
12/01/2019 13:30:28
MartinBG avatar MartinBG 1042 Точки

Както съм писал по-горе, колекцията има два метода remove, които се различават само по типа на подаденият параметър, т.е. меодът, който ще се изпълни се определя от типа на параметъра.

Ако подадем int, ще се извика версията, която премахва елемент по индекс.

Ако подадем Object (всички класове в Java наследяват Object класа и съответно може да се разглеждат като Object), тогава колекцията ще бъде претърсена за елемент, който съвпада с подадения, и първият съвпаднал такъв ще бъде премахнат.

 

Примера по-горе го написах малко набързо и всъщност има още по-просто решение - замени типа на numberToRemove (ред 21 в кода ти) от int на Integer, и всичко ще работи коректно:

                case "Remove":
                    // int numberToRemove = Integer.parseInt(commandArr[1]);
                    Integer numberToRemove = Integer.parseInt(commandArr[1]);
                    numbers.remove(numberToRemove);
                    break;

 

1
12/01/2019 22:41:50
KaloyanStoyanovvv avatar KaloyanStoyanovvv 20 Точки

Много благодаря за разясненията и фикса по кода! Сега наистина е малко по-ясно какво става.

0