#java #arrays #switch-statement #sentinel
#java #массивы #оператор переключения #sentinel
Вопрос:
Я работаю над кодом, который показывает простую работу с массивом. Кажется, я не могу заставить его работать в части повторной вставки удаленного элемента внутри моего созданного массива. Моя цель — поместить другой элемент внутри другого удаленного элемента (когда я удаляю элемент, он становится 0). Мой случай вставки просто сообщает о дублирующемся вводе, он не позволяет мне возобновить работу в удаленном элементе в определенной позиции.
case 2:
{
if (limit1 < 5 || limit1 > 20){
System.out.println("Error: Invalid Array Limit");
System.out.println("Press Any Key To Continue...");
new java.util.Scanner(System.in).nextLine();
System.out.print('u000C');
m();
}
else{
System.out.println("Enter the " array.length " numbers now.
Or enter -1 to exit");
int i = 0;
while(i < array.length){
array[i] = in.nextInt();
boolean dups = false;
if(array[i] != -1){
for(int k = 0; k < i; k )
if(array[k] == array[i])
{
System.out.println("Error: Duplicate Element");
System.out.println("Please Enter Another Value");
dups = true;
break;
}
if(!dups){
i ;}
}
else{
array[i] = 0;
System.out.println("Exit Confirmed");
System.out.println("Press Any Key To Continue...");
new java.util.Scanner(System.in).nextLine();
System.out.print('u000C');
m();
}
}
System.out.println("You have entered the " limit1 " numbers");
System.out.println("Press Any Key To Continue...");
new java.util.Scanner(System.in).nextLine();
System.out.print('u000C');
m();
}
}
Другая проблема заключается в том, что если я ввожу значение sentinel (-1), оно просто делает текущую позицию ввода 0. Я просто хочу выйти из дела, а не ставить 0 в позицию
Комментарии:
1. Не могли бы вы, пожалуйста, обрезать свой код, чтобы демонстрировать только код, с которым у вас возникли проблемы?
2. извините, из вопроса или кода мне не ясно, в чем может быть проблема. Возможно, все это можно было бы понять, если вы просто создадите junit-testcases, сосредоточив внимание на функциональности ядра, вместо того, чтобы использовать весь консольный ввод.
Ответ №1:
Я вижу некоторые проблемы с вашим кодом. Использование switch
операторов без каких-либо break
операторов не является хорошей практикой. Вы можете легко реорганизовать свой метод, чтобы использовать цикл while следующим образом:
public void e() {
do {
m();
choice1 = in.nextInt();
cls();
if (choice1 > 0) {
processChoice(); // contains switch block for processing input
}
} while (choice1 > 0); // Loop will terminate when user presses 0
}
Это также должно завершать работу вашей программы всякий раз, когда пользователь нажимает 0
.
Я вижу проблему в вашей вставке в блок массива. Похоже, вы присваиваете значение, полученное из ввода, непосредственно array[i]
. Какой смысл проверять, является ли это повторяющимся значением после его присвоения array[i]
. Я думаю, вы должны сделать что-то вроде этого:
while (i < array.length) {
int currentInput = in.nextInt();
boolean dups = false;
if (array[i] != -1) {
for (int k = 0; k < i; k )
if (array[k] == currentInput) {
System.out.println("Error: Duplicate Element");
System.out.println("Please Enter Another Value");
dups = true;
break;
}
if (!dups) { // currentInput not a duplicate; assign to array[i]
array[i] = currentInput;
i ;
}
Что касается выхода при предоставлении -1
, вам, вероятно, следует удалить эту строку array[i] = 0
, чтобы не назначать 0
array[i]
:
if (array[i] != -1) {
// ...
} else {
System.out.println("Exit Confirmed");
System.out.println("Press Any Key To Continue...");
new Scanner(System.in).nextLine();
System.out.print('u000C');
break;
}
Ответ №2:
Вот некоторые ошибки, которые я обнаружил в вашем коде:
- Вы переходите к
System.out.plintln("Enter the " array.length "....");
новой строке в середине строки, вы должны сделать что-то подобное:
System.out.println("Enter the " array.length " numbers now." "nOr enter -1 to exit")
- если входные данные равны -1, вы не выходите сразу, но выполняете array[i]=0 (помните, что array[i] теперь равен array[-1])
- тогда вы не прерываете цикл после ввода -1
- регистр не должен заключаться в квадратные скобки и всегда должен заканчиваться на break:
case 1:
//DO THINGS
//....
//...
break;
case 2:
//DO OTHER THINGS
//....
//...
break;
Вот несколько предложений о том, как его улучшить:
- Я не очень хорошо помню Java, но я не думаю, что вам нужно каждый раз создавать новый сканер
- на вашем месте я бы первым делом проверил, равен ли входной сигнал -1 (есть несколько способов сделать это)
- не использование скобок для for немного сбивает с толку
- вы уже прерываетесь при обнаружении дубликата, поэтому вам не нужно проверять его снова с помощью
if(!dups)
Я надеюсь, что это решит вашу проблему.