Замена элемента

#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)

Я надеюсь, что это решит вашу проблему.