Как получить предыдущую строку текста из стека в Java - PullRequest
0 голосов
/ 11 марта 2019

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

Для этого файла требуется только метод main, который выполняет следующие действия, пока пользователь не введет команду «quit»:

• Предлагает пользователю указать URL-адрес для посещения, для возврата (только когда это возможно) или для выхода

• Посещает и отображает введенный URL

• Возвращается и отображает ранее посещенный URL (если возможно)

• Если пользователь вводит «назад», когда нет страницы для возврата, должно отображаться соответствующее сообщение.

Вот пример вывода:

Введите URL или «выйти»: назад

Нет URL для возврата на

Введите URL или «выйти»: http://www.wwe.com

Текущий URL: http://www.wwe.com

Введите URL или «выйти»: назад

Нет URL для возврата на

Текущий URL: http://www.wwe.com

Введите URL или «выйти»: http://www.amazon.com

Текущий URL: http://www.amazon.com

Введите URL, «назад» или «выйти»: http://www.google.com

Текущий URL: http://www.google.com

Введите URL, «назад» или «выйти»: назад

Текущий URL: http://www.amazon.com

Введите URL, «назад» или «выйти»: назад

Текущий URL: http://www.wwe.com

Введите URL или «выйти»: выйти

Вот мой текущий код:

public class BrowsingHistory
{
 public static void main(String [] args)
 {

    Scanner url = new Scanner(System.in);
    String web = "";
    String currentURL = "";
    Stack<String> myStack = new Stack<>();
    System.out.print("Enter a URL or \"quit\": ");
    web = url.nextLine();
    while (!web.contains("quit"))
    {
        System.out.println();
        System.out.print("Enter a URL, \"back\", or \"quit\": ");
        web = url.nextLine();
        if(web.equals("back") && myStack.isEmpty())
        {
            System.out.println("No URL to go back to");

        }
            else if(!web.equals("back"))
            {
                myStack.push(web);
                System.out.println("Current URL: " + myStack.peek());
            }
            else
                {
                    System.out.println("No URL to go back to");
                    System.out.println("Current URL: " + myStack.pop());
        }
        }
}
}

Вот тесты, которые нужно пройти, чтобы прояснить:

 @Test
 void testMain()
 {
     setInput("back\nhttp://www.uwec.edu\nback\nhttp://www.amazon.com\nhttp://.    w.google.com\nback\nback\nquit\n");

BrowsingHistory.main(null);

 String mainOutput = outContent.toString();

  Scanner driverOut = new Scanner(mainOutput);

     String outputLine = getNextOutputLine(driverOut);

    assertEquals("Enter a URL or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (initial prompt problem)");

Ошибка в этой строке ниже:

    assertEquals("No URL to go back to", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (can't go back issue)");

остальное проходит:

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("Current URL: http://www.uwec.edu", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("No URL to go back to", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (can't go back issue)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Current URL: http://www.uwec.edu", outputLine.trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("Current URL: http://www.amazon.com", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL, \"back\", or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("Current URL: http://www.google.com", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL, \"back\", or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("Current URL: http://www.amazon.com", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL, \"back\", or \"quit\":", outputLine.substring(0, outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (prompt problem)");
    assertEquals("Current URL: http://www.uwec.edu", outputLine.substring(outputLine.indexOf(":")+1).trim(), "BrowsingHistory doesn't run as expected (current url problem)");

    outputLine = getNextOutputLine(driverOut);
    assertEquals("Enter a URL or \"quit\":", outputLine.trim(), "BrowsingHistory doesn't run as expected (prompt problem)");

    assertFalse(driverOut.hasNext(), "BrowsingHistory doesn't run as expected (quit problem)");

    driverOut.close();
}

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

Использование класса Stack вместо ArrayList сделает вашу жизнь намного проще.

Используйте push (), чтобы добавить новые URL в стек.

Используйте empty (), чтобы проверить, можете ли вы идтиback.

Используйте pop () для возврата назад.

EDIT - поддержка вперед

Если вы хотите также поддерживать команду 'forward'Вы можете использовать второй стек и выдвинуть URL, которые вы извлекли из стека истории в этом стеке вперед.Когда введена команда «forward», проверьте, пустой ли стек вперед, и, если нет, извлеките URL-адрес оттуда и вставьте его обратно в стек истории.

EDIT 2 -пример кода

Вот некоторый элементарный код для объяснения решения с двумя стеками:

Stack<String> historyStack = new Stack<>();
Stack<String> forwardStack = new Stack<>();
String currentUrl = null;

boolean running = true;
while(running) {
    String input = getUserInput();
    switch(input) {
        case "quit":
            running = false;
            break;
        case "back":               
            if (!historyStack.empty()) {
                if (currentUrl != null) {
                    forwardUrl.push(currentUrl);
                }
                currentUrl = historyStack.pop();
                System.out.println(currentUrl);
            } else {
                System.out.println("nothing to go back to");
            }
            break;
        case "forward":
            if (!forwardStack.empty()) {
                if (currentUrl != null) {
                    historyStack.push(currentUrl);
                }
                currentUrl = forwardStack.pop();
                System.out.println(url);
            } else {
                System.out.println("nothing to go forward to");
            }
            break;
        default:
            if (currentUrl != null) {
                historyStack.push(currentUrl);
            }
            currentUrl = input;
            System.out.println(url);
            // entering a new url makes forward stack invalid
            forwardStack.clear();
    }
}
1 голос
/ 11 марта 2019

Вы можете изменить свою логику следующим образом:

ArrayList<String> webs = new ArrayList<String>();
String web = "";
Scanner url = new Scanner(System.in);

int count = 0;
while (!web.contains("quit")) {
    System.out.println("Enter a URL or \"quit\":");
    web = url.next();
    if (!web.equals("back")) {
        webs.add(web);
        count = webs.size();
    } else if (web.equals("back") && !webs.isEmpty()) {
        if (count > 0) {
            count--;
            System.out.println(webs.get(count));
        } else {
            System.out.println("No url to go back to");
        }
    }
}

Обратите внимание на следующие моменты:

  1. Мы добавляем только Строки , которые не равны назад
  2. В вашей предыдущей реализации первый введенный url не был вставлен в ваш список.
  3. После добавления элемента в список счетчик сбрасывается до размера списка.

Как уже отмечали другие, того же самого можно достичь гораздо проще, используя Stack

Scanner url = new Scanner(System.in);
String web = "";
Stack<String> myStack = new Stack<>();
while (!web.contains("quit")) {
    System.out.println("Enter a URL or \"quit\":");
    web = url.next();
    if (!web.equals("back") && !web.equals("quit")) {
        myStack.push(web);
    } else {
        if (!myStack.isEmpty()) {
            System.out.println(myStack.pop());
        } else {
            System.out.println("No url to go back to");
        }
    }
}
0 голосов
/ 11 марта 2019

Вы используете неверную структуру данных. List в порядке, но использование Stack здесь более правильно: вы добавляете в конец и извлекаете из конца этот идентификатор LIFO .

private static final String QUIT = "quit";
private static final String BACK = "back";

try (Scanner url = new Scanner(System.in)) {
    Deque<String> stack = new LinkedList<>();

    while (true) {
        System.out.print("Enter a URL, \"" + BACK + "\" or \"" + QUIT + "\": ");
        String str = url.next();

        if (str.equalsIgnoreCase(QUIT))
            break;
        else if (str.equalsIgnoreCase(BACK)) {
            if (!stack.isEmpty())
                stack.pop();
            System.out.println(stack.isEmpty() ? "No URL to go back to" : stack.element());
        } else
            stack.push(str);
    }
}

Демо

Enter a URL, "back" or "QUIT": http://www.wwe.com
Enter a URL, "back" or "QUIT": http://www.amazon.com
Enter a URL, "back" or "QUIT": http://www.google.com
Enter a URL, "back" or "QUIT": back
http://www.amazon.com
Enter a URL, "back" or "QUIT": back
http://www.wwe.com
Enter a URL, "back" or "QUIT": back
No URL to go back to
Enter a URL, "back" or "QUIT": quit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...