Принятие строковых входов в массив и проверка доступности строки в массиве - PullRequest
0 голосов
/ 01 октября 2019

Итак, я совершенно новичок в Java и хочу создать код, который будет принимать входные данные от пользователя и сохранять его в массиве. После этого в следующем операторе я введу значение в терминал, и я хочу, чтобы код сравнивал мой строковый ввод с одной из строк в массиве и печатал доступный на терминале, когда строка доступна, и наоборот. Первая часть моего кода была правильной (надеюсь), но у меня была проблема при сравнении строк. Я чувствую, что он не проверяет строки с моим вводом в коде. Вот мой код, может ли кто-нибудь помочь мне с этим? Огромное спасибо.

import java.util.Scanner;
class Course {
 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  String a[] = new String[20] //assuming max 20 strings
  System.out.println("Enter no. of courses");
  int no_of_courses = sc.nextInt(); // number of strings
  if (no_of_courses <= 0)
   System.out.println("Invalid Range");
  else {
   System.out.println("Enter course names:");
   for (int i = 0; i < no_of_courses; i++) {
    a[i] = sc.next(); //accepting string inputs
   }
   System.out.println("Enter the course to be searched:");
   String search = sc.next() //entering a string to search
   for (int i = 0; i < no_of_courses; i++) {
    if (a[i].equals(search)) //I feel the problem is here
     System.out.println(search + "course is available");
     break;
     else
      System.out.println(search + "course is not available");
    }
   }
  }
 }

Я ожидаю, что результат будет

<string> course is available

, когда моя строка соответствует строке в массиве, и

<string> course is not available

, когда мойвведенная строка не соответствует строке в массиве

Но нет выходных данных: (

Ответы [ 4 ]

1 голос
/ 01 октября 2019
class Course {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String a[] = new String[20] ;                //assuming max 20 strings
                System.out.println("Enter no. of courses");
        int no_of_courses = sc.nextInt();           // number of strings
        if(no_of_courses <= 0)
            System.out.println("Invalid Range");
            else
            {
                System.out.println("Enter course names:");
                for(int i=0 ; i < no_of_courses ; i++)
                {
                    a[i] = sc.next();                            //accepting string inputs
                }
                System.out.println("Enter the course to be searched:");
                String search = sc.next()   ;             //entering a string to search
                boolean found = false;
                        for(int i = 0 ; i < no_of_courses ; i++)
                        {
                            if(a[i].equalsIgnoreCase(search))                   //I feel the problem is here
                            {
                                **found = true;**
                                break;
                            }   

                            }
                        if(found) {
                            System.out.println(search+ "course is available"); 
                        }else {
                            System.out.println(search+ "course is not available");
                        }
                        }
            }
    }
1 голос
/ 01 октября 2019

Я изменил ваш код и прокомментировал строку, где это нужно объяснить. проверьте это внимательно.

import java.util.Scanner;

class Course {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("Enter no. of courses");
        int no_of_courses = sc.nextInt(); // number of strings
        String a[] = new String[no_of_courses]; // do not assume when you have proper data.
        if (no_of_courses <= 0)
            System.out.println("Invalid Range");
        else {
            System.out.println("Enter course names:");
            for (int i = 0; i < no_of_courses; i++) {
                a[i] = sc.next(); // accepting string inputs
            }
            System.out.println("Enter the course to be searched:");
            String search = sc.next(); // entering a string to search
            boolean flag = false;
            for (int i = 0; i < no_of_courses; i++) {
                if (a[i].equals(search)) // I feel the problem is here
                {
                    flag = true;//do not print here. just decide whether course is available or not
                    break;
                }
            }
            //at the end of for loop check your flag and print accordingly.
            if(flag) {
                System.out.println(search + "course is available");
            }else {
                 System.out.println(search + "course is not available");
            }
        }

    }
}
0 голосов
/ 01 октября 2019

Это действительно хорошее усилие, и вы почти получили его. Так что просто пара вещей

  1. Поскольку вы вводите количество курсов, просто используйте это значение для инициализации массива (это хорошая практика, чтобы попытаться не инициализировать вещи до того, как вам действительно потребуется)их).
  2. Если вы делаете String сравнения и чувствительность к регистру не имеет значения, используйте .equalsIgnoreCase(String)
  3. Для решения вашей проблемы вам просто нужна переменная boolean, чтобы указатьдействительно ли вы нашли совпадение. Первоначально это будет FALSE (совпадение не найдено), и вы будете проходить по вашему массиву, пока совпадение не будет найдено. Когда он будет найден, он будет помечен TRUE, и вы break выйдете из цикла (что вы правильно сделали).
  4. Только однажды выйдя из цикла, вы распечатаете, нашли ли вы совпадение.

Посмотрите:

public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  System.out.println("Enter no. of courses");
  int no_of_courses = sc.nextInt();           // number of strings
  if (no_of_courses <= 0) {
    System.out.println("Invalid Range");
  } else {
    String a[] = new String[no_of_courses];
    System.out.println("Enter course names:");
    for (int i = 0; i < a.length; i++) {
      a[i] = sc.next();                            //accepting string inputs
    }
    System.out.println("Enter the course to be searched:");
    String search = sc.next();                //entering a string to search
    boolean courseFound = Boolean.FALSE;
    for(int i = 0; i < a.length; i++) {
      if (a[i].equalsIgnoreCase(search)) {
        courseFound = Boolean.TRUE;
        break;
      }
    }
    if(courseFound) {
      System.out.println(search + "course is available");
    } else {
      System.out.println(search + " course is not available");
    }
  }
}

О, просто для интереса (и когда вы начнете работать с некоторыми более продвинутыми конструкциями), вы всегда можете просто использовать stream, которыйбыл введен в Java 8. Он урезает 12 строк до 5 ...

if(Arrays.stream(a).anyMatch(i -> i.equalsIgnoreCase(search))) {
  System.out.println(search + " course is available");
} else {
  System.out.println(search + " course is not available");
}
0 голосов
/ 01 октября 2019

Я заметил несколько вещей - ваша программа работает до конца? Когда я копировал / вставлял в свои мысли, я заметил несколько пропущенных точек с запятой, и, как сказал Yhlas, ваш последний синтаксис оператора if / else неверен.

И это не имеет никакого отношения к тому,не ваша программа даст вам правильный ответ, но ваш последний цикл будет печататься снова и снова, потому что он будет проверять каждый элемент в a, и каждый раз, когда он зацикливается и обнаруживает несоответствие, он выводит что-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...