Попросить пользователя ввести указанное c количество строк, а затем добавить каждую строку в массив? - PullRequest
0 голосов
/ 05 марта 2020

Впервые до java. Мне нужно спросить пользователя количество строк (состоящих только из прописных и строчных букв, пробелов и цифр), которые они хотят ввести. Эти строки должны храниться в массиве. Затем я создал логический метод, позволяющий определить, являются ли эти строки палиндроми c (игнорируя пробелы и регистры). Если это палиндроми c, то я добавляю в список результатов для печати позже. Я не совсем понимаю, как попросить пользователя ввести точное количество строк и как проверить каждую отдельную строку. Я должен использовать StringBuilder. Это то, что я до сих пор (это вроде беспорядок, извините). Мне кажется, что я неправильно использую StringBuilder / массив, как я могу это исправить?

public class Palindromes {

    public static void main(String[] args) {
        int numOfStrings;

        Scanner scan = new Scanner(System.in);  // Creating Scanner object
        System.out.print("Enter the number of strings: ");
        numOfStrings = scan.nextInt();

        System.out.print("Enter the strings: ");
        StringBuilder paliString = new StringBuilder(numOfStrings);
        for(int n=0; n < paliString; n++){
            paliString[n] = scan.nextLine();
            scan.nextLine();

            String[] stringPali = new String[numOfStrings];

            StringBuilder str = paliString;
            if(isPali(userString)){
                paliString = append.userString;
            }
            System.out.println("The palindromes are: " + userString ";");
        }

    static boolean isPali(String userString) {
        int l = 0;
        int h = userString.length() - 1;

        // Lowercase string
        userString = userString.toLowerCase();

        // Compares character until they are equal
        while (l <= h) {

            char getAtl = userString.charAt(l);
            char getAth = userString.charAt(h);

            // If there is another symbol in left
            // of sentence
            if (!(getAtl >= 'a' && getAtl <= 'z'))
                l++;

            // If there is another symbol in right
            // of sentence
            else if (!(getAth >= 'a' && getAth <= 'z'))
                h--;

            // If characters are equal
            else if (getAtl == getAth) {
                l++;
                h--;
            }

            // If characters are not equal then
            // sentence is not palindrome
            else
                return false;
        }

        // Returns true if sentence is palindrome
        return true;
    }
}

РЕЗУЛЬТАТ ОБРАЗЦА:

Enter the number of strings: 8

Enter the strings:

Race Car

Mountain Dew

BATMAN

Taco Cat

Stressed Desserts

Is Mayonnaise an instrument

swap paws

A Toyotas a Toyota

The palindromes are: Race Car; Taco Cat; Stressed Desserts; swap paws; A Toyotas a Toyota

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

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

Это один делает свое дело.

    public static void main(String[] args) {
        int numOfStrings;

        Scanner scan = new Scanner(System.in);  // Creating Scanner object
        System.out.print("Enter the number of strings: ");
        numOfStrings = scan.nextInt();
        scan.nextLine(); // you need this to catch the enter after the integer you entered

        System.out.print("Enter the strings: ");
        StringBuilder paliString = new StringBuilder();
        for (int n = 0; n < numOfStrings; n++) {
            String userString = scan.nextLine();
            if (isPali(userString)) {
                if (paliString.length() > 0) {
                    paliString.append("; ");
                }
                paliString.append(userString);
            }
        }
        System.out.println("The palindromes are: " + paliString);
    }

Ключевые изменения:

  • Я добавил scan.nextLine(); сразу после прочтения количества строк. Это обрабатывает новую строку, которую вы получаете, когда пользователь нажимает Enter.
  • Вам не нужно инициализировать StringBuilder с помощью numOfStrings. Это просто предварительно распределяет размер StringBuilder в символах. Не количество строк. В любом случае, это не обязательно. StringBuilder растет по мере необходимости.
  • Я предлагаю вам проверить, что я делал внутри for-l oop. Это был самый большой беспорядок и значительно изменился.
  • Последнее, но не менее важное: запись результата должна быть за пределами for-l oop, после того как все палиндромы были добавлены в StringBuilder.

Редактировать

Исходя из вашего комментария, в этой следующей итерации я изменил использование StringBuilder на использование ArrayList. (Что-то совершенно другое) Я использую это здесь, потому что списки в Java растут по требованию. А поскольку число палиндромов, вероятно, не равно количеству входных строк, это путь к go. Чтобы действительно присвоить его массиву, всегда можно вызвать String[] paliStringsArray = paliStrings.toArray(new String[]{});, но так как ArrayLists уже используют базовый массив и не нужны для генерации нужного вам вывода, я не поместил его в новую версию.

Пожалуйста, сравните различия этого шага с предыдущей версией. Я также добавил эту String.join("; ", paliStrings) часть, которая создает желаемый результат.

    public static void main(String[] args) {
        int numOfStrings;

        Scanner scan = new Scanner(System.in);  // Creating Scanner object
        System.out.print("Enter the number of strings: ");
        numOfStrings = scan.nextInt();
        scan.nextLine(); // you need this to catch the enter after the integer you entered

        System.out.print("Enter the strings: ");
        List<String> paliStrings = new ArrayList<>();
        for (int n = 0; n < numOfStrings; n++) {
            String userString = scan.nextLine();
            if (isPali(userString)) {
                paliStrings.add(userString);
            }
        }
        System.out.println("The palindromes are: " + String.join("; ", paliStrings));
    }

А теперь последний шаг. Арвинд Кумар Авина sh фактически решил часть, которую я также пропустил в первоначальном вопросе. (Я буду читать более внимательно в будущем). Он проверял пользовательский ввод. Поэтому для последней итерации я добавил его код проверки измененным способом. Я положил это в метод, так как думаю, что это проясняет ситуацию и избавляет от необходимости переменной boolean valid.

    public static void main(String[] args) {
        int numOfStrings;

        Scanner scan = new Scanner(System.in);  // Creating Scanner object
        System.out.print("Enter the number of strings: ");
        numOfStrings = scan.nextInt();
        scan.nextLine(); // you need this to catch the enter after the integer you entered

        System.out.print("Enter the strings: ");
        List<String> paliStrings = new ArrayList<>();
        for (int n = 0; n < numOfStrings; n++) {
            String userString = readNextLine(scan);
            if (isPali(userString)) {
                paliStrings.add(userString);
            }
        }
        System.out.println("The palindromes are: " + String.join("; ", paliStrings));
    }

    static String readNextLine(Scanner scanner) {
        while (true) {
            String userString = scanner.nextLine();
            if (userString.matches("[A-Za-z0-9 ]+")) {
                return userString;
            } else {
                System.out.println("Error: invalid input.");
            }
        }
    }
0 голосов
/ 05 марта 2020

Мне нужно спросить пользователя количество строк (состоящих только из прописных и строчных букв, пробелов и цифр), которые они хотят ввести. Эти строки должны храниться в массиве.

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

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        boolean valid = true;
        int numOfStrings = 0;
        do {
            valid = true;
            System.out.print("Enter the number of strings: ");
            try {
                numOfStrings = Integer.parseInt(scan.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("Error: invalid input.");
                valid = false;
            }
        } while (!valid);
        String[] stringPali = new String[numOfStrings];
        String input;
        for (int i = 0; i < numOfStrings; i++) {
            do {
                valid = true;
                System.out.print("Enter a string consisting of only letters and digits: ");
                input = scan.nextLine();
                if (!input.matches("[A-Za-z0-9 ]+")) {
                    System.out.println("Error: invalid input.");
                    valid = false;
                }
            } while (!valid);
            stringPali[i] = input;
        }
    }
}

Пример прогона:

Enter the number of strings: a
Error: invalid input.
Enter the number of strings: 3
Enter a string consisting of only letters and digits: Arvind
Enter a string consisting of only letters and digits: Kumar Avinash
Enter a string consisting of only letters and digits: !@£$%^&*()_+
Error: invalid input.
Enter a string consisting of only letters and digits: Hello @
Error: invalid input.
Enter a string consisting of only letters and digits: Hello 123

Не стесняйтесь комментировать в случае каких-либо сомнений / выпуск.

Wi sh вам всего самого наилучшего!

[обновление]

На основании вашего запроса я разместил следующее обновление, которое запрашивает строки только один раз, а затем позволяет пользователю вводить все строки один за другим:

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        boolean valid = true;
        int numOfStrings = 0;
        do {
            valid = true;
            System.out.print("Enter the number of strings: ");
            try {
                numOfStrings = Integer.parseInt(scan.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("Error: invalid input.");
                valid = false;
            }
        } while (!valid);

        String[] stringPali = new String[numOfStrings];
        String input;
        System.out.println("Enter " + numOfStrings + " strings consisting of only letters and digits: ");
        for (int i = 0; i < numOfStrings; i++) {
            do {
                valid = true;
                input = scan.nextLine();
                if (!input.matches("[A-Za-z0-9 ]+")) {
                    System.out.println("Error: invalid input.");
                    valid = false;
                }
            } while (!valid);
            stringPali[i] = input;
        }
    }
}

Пример выполнения:

Enter the number of strings: 3
Enter 3 strings consisting of only letters and digits: 
Arvind
Kumar
He$ll0
Error: invalid input.
Avinash

Не стесняйтесь комментировать в случае каких-либо сомнений.

...