Логическая ошибка приводит к тому, что оператор будет напечатан дважды в цикле while

Несколько более чистое решение, чем принятый ответ (на основе этот вопрос ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Я решил поместить его в вспомогательный класс как статическую утилиту. Пример использования:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

В этом ответе показано, как получить приложение из Play Маркета, если приложение отсутствует, хотя следует проявлять осторожность на устройствах, которые не есть Play Store.

0
задан Daniel Widdis 3 March 2019 в 23:51
поделиться

2 ответа

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

В частности, вы используете keyboard.nextInt(); в верхней ветви и keyboard.next(); в нижней ветви. Хотя они читают следующее целое число и символ, соответственно, они не обрабатывают маркер конца строки.

Затем, когда вы достигаете вершины цикла, вы вызываете keyboard.nextLine(), который обрабатывает любые символы, встречающиеся после int (или символа в случае удаления всех), до конца маркера строки. С ожидаемым пользовательским вводом это просто пустая строка.

Чтобы это исправить, вам нужно убедиться, что вы читаете все keyboard.nextLine() в тех случаях, когда вы читаете только целые числа или один символ.

0
ответ дан Daniel Widdis 3 March 2019 в 23:51
поделиться

Что происходит, то условие для вас, когда цикл равен

while (!command.equalsIgnoreCase("quit"))

, что по-английски означает, что, если команда не равна «выход», запустите этот цикл.

Внутри цикла команда никогда не устанавливается на «выход». Например, если я задаю входную строку как «abcde» и прошу удалить «c» в позиции 1. Затем ваша логика устанавливает здесь команду «удалить»

command = keyboard.nextLine();

, а затем выводит окончательное значение как «abde» , Теперь, когда цикл заканчивается, команда все еще «удаляет» и, следовательно, цикл выполняется снова.

Возможное решение - явно спросить пользователя, хочет ли он повторить попытку, используя цикл do while. Также просто совет, я вижу, что вы использовали nextInt. Желательно использовать nextLine сразу после следующего int. посмотрите на это по следующей причине: Java Scanner не ожидает ввода данных пользователем

, это то, что вы кодировали бы, если бы вы явно приняли согласие пользователя, если вы хотите выполнить больше команд:

public static void main (String[] args) throws java.lang.Exception
    {
    Scanner keyboard = new Scanner(System.in);
        // Output Variables
        String userInput = "";

        // Variables
        String removeChar = "", removeAllChar = "";
        int removeIndex = 0;

        // First Output
        System.out.println("Enter the string to be manipulated");
        userInput = keyboard.nextLine();
        String command = "";
        String retry = "";
        // While loop
        do {
            // Output
            System.out.println("Enter your command (reverse, replace first, replace last, remove all, remove)");
            command = keyboard.nextLine();
            if (command.equalsIgnoreCase("remove")) {
                System.out.println("Enter the character to remove");
                removeChar = keyboard.nextLine();
                int totalCount = 0;
                for (int j = 0; j < userInput.length(); j++) {
                    if (userInput.charAt(j) == removeChar.charAt(0)) {
                        totalCount = totalCount + 1;
                    }
                }
                System.out.println("Enter the " + removeChar
                        + " you would like to remove (Not the index - 1 = 1st, 2 = 2nd, etc.):");
                removeIndex = keyboard.nextInt();
                keyboard.nextLine();
                int currentIndex = 1;
                if (removeIndex <= totalCount) {
                    for (int i = 0; i < userInput.length(); i++) {
                        if (userInput.charAt(i) == removeChar.charAt(0)) {
                            if (currentIndex == removeIndex) {
                                String firstpartOfString = userInput.substring(0, i);
                                String secondpartOfString = userInput.substring(i + 1, userInput.length());
                                System.out.println("The new sentence is " + firstpartOfString + secondpartOfString);
                                userInput = firstpartOfString + secondpartOfString;
                                break;
                            } else {
                                currentIndex = currentIndex + 1;
                            }
                        }
                    }
                } else {
                    System.out.println("Can't find " + removeChar + " occuring at " + removeIndex + " int the string.");
                }
                // Remove All Code

            } else if (command.equalsIgnoreCase("remove all")) {
                System.out.println("Enter the character to remove");
                removeAllChar = keyboard.next();
                String newString = "";
                for (int i = 0; i < userInput.length(); i++) {
                    if (userInput.charAt(i) != removeAllChar.charAt(0)) {
                        newString = newString + userInput.charAt(i);
                    }
                }
                userInput = newString;
                System.out.println("The new sentence is " + userInput);

            }
            System.out.println("Do you want to go again?");
            retry = keyboard.nextLine();
            // Bracket for while loop
        }while("yes".equalsIgnoreCase(retry));
    }
0
ответ дан Vardaan Sharma 3 March 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: