Если я правильно понимаю, вы должны реализовать метод с этим заголовком
public static void removeDuplicate(ArrayList<Integer> list)
судя по его имени, я бы сказал, что метод должен удалить дубликаты из списка, а не (как вы делаете это прямо сейчас) цикл while-while во время ввода.
So сначала удалите проверку в своем цикле (if(!list.contains(value)&& value !=0)
) и просто добавьте все числа, которые пользователь вводит в список.
После этого вы можете позвонить по методу removeDuplicate(list);
. Если вы хотите, вы можете добавить этот вызов в свой цикл, и он будет выполнен после каждого ввода или вы выполните его только один раз, когда вход будет закрыт.
Теперь реализации метода:
public static void removeDuplicate(ArrayList<Integer> list) { // this is the header you need to use
Проблема здесь есть, метод знает список, но не элемент, который является возможным дубликатом. Таким образом, вы должны смотреть на это
for (int i = 0; i < list.size(); i++) { // iterate through every element in the list
Integer current = list.get(i); // for convenience, save the current list item in a variable
Таким образом, вы проверяете каждое целое число в списке - по одному .. но если вы хотите знать, если целое число существует во второй раз, вы должны искать хвост список. Значит, вам нужно проверить подписок после i.
List sublist = list.subList(i + 1, list.size()); // the sublist with all elements of the list from i+1 to the end
ваш list.contains(value)
линия правильно, вы можете использовать его здесь. Только теперь вы вызываете его на подсписке
if(sublist.contains(current)){ // checks if the number is in the sublist
sublist.remove(current); // removes the number from the sublist
}
Это, однако, было бы только удалить первый дублировать. Кроме того, вы можете удалить каждый элемент в списке, который равняется current
целого:
while (sublist.contains(current)) {
sublist.remove(current);
}
И это все. Ваш метод закончен.
}
}
Закончен, потому что вы фактически работаете над одним и только списком в своей программе.Даже при удалении целого числа от вашего sublist
, он фактически отстранен от sublist
и реального списка (The sublist
просто ссылка, а не фактический список самостоятельно)
EDIT
для вашего удобства здесь полный код с обоими методами. Если вы сравните код с вашим, вы увидите, что это не так много:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner input = new Scanner(System.in);
System.out.print("Enter integers (input ends with 0): ");
int value;
do {
value = input.nextInt();
if (value != 0) { // this changed: add every number except 0
list.add(value);
}
} while (value != 0);
input.close();
removeDuplicate(list); // here you make the call for the new method
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
}
// and this is the new method
public static void removeDuplicate(ArrayList<Integer> list) {
for (int i = 0; i < list.size(); i++) {
Integer current = list.get(i);
List sublist = list.subList(i + 1, list.size());
while (sublist.contains(current)) {
sublist.remove(current);
}
}
}
Как я могу удалить? Извините, у этого вопроса есть ответы и их нельзя удалить; Вместо этого отметьте это для замедлителя внимания. Это сообщение показывает. – Young
вы также можете просто оставить его здесь. В этом вопросе нет ничего плохого. И, может быть, кто-то может выиграть от этой темы. Кроме того, вы можете принять один из ответов, нажав на прозрачный «крючок» слева от него. Таким образом, другим читателям легче найти ответ, который помог вам самому, а другие не будут реагировать, поскольку «вопрос закрыт» – GameDroids
О, я вижу, спасибо – Young