0

So my issue is, that i am hung up on the second while statement. I am supposed to allow the user to put have multiple lines of input(all given at the same time) and the while loop ends its self after all of the input is used the input is as follows

The speed limit is 40 mph, but you were going over 65

99 bottles of ...

The code only uses the first input then closes, when i use scan.hasNextLine it stays in an infinite loop

public static void main(String[] args) throws IOException {
    Scanner scan = new Scanner(System.in);
    Scanner scan2 = new Scanner(System.in);
    List<Integer> numbers = new ArrayList<>();
    Pattern p = Pattern.compile("([-+]?[0-9]+(?:\\.[0-9]+)?)");

    String phrase;
    String[] tens = { "Ten", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
    String[] teens = { "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
            "Nineteen" };
    String[] ones = { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };

    phrase = scan.nextLine();

    Matcher m = p.matcher(phrase);
    while (m.find()) {
        numbers.add(Integer.parseInt(m.group()));

    }
    // Solve

    while (There is another line of input) {// i need some help here!!!
        for (int i = 0; i < numbers.size(); i++) {

            if (numbers.get(i) >= 20) {

                if (numbers.get(i) % 10 == 0) {
                    phrase = phrase.replaceAll(Integer.toString(numbers.get(i)),
                            tens[((numbers.get(i) - numbers.get(i) % 10) / 10) - 1]);
                } else {

                    phrase = phrase.replaceAll(Integer.toString(numbers.get(i)),
                            (tens[((numbers.get(i) - numbers.get(i) % 10) / 10) - 1] + "-"
                                    + ones[numbers.get(i) % 10]));
                }

            } else if (numbers.get(i) < 20 && numbers.get(i) > 10) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), teens[(numbers.get(i) % 10) - 1]);

            } else if (numbers.get(i) < 10 && numbers.get(i) > 0) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), ones[numbers.get(i)]);
            } else if (numbers.get(i) == 10) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), "Ten");
            } else if (numbers.get(i) == 0) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), "Zero");
            }

        }

    }
    System.out.println(phrase);
}
  • You say "I am supposed to allow the user to put have multiple lines of input(all given at the same time)". So, a multi-line piece of text is pasted in to the console and you press enter, right? Have you tried doing another `scan.nextLine()` right after the `hasNextLine()`? – Koen De Groote Feb 16 '17 at 22:55
  • Ignore my previous ramblings, there's this to consider: http://stackoverflow.com/a/23713487/5629413 – Koen De Groote Feb 16 '17 at 23:05
  • If my answer helped you, you can accept it as the answer. – Wasi Ahmad Feb 18 '17 at 20:18

1 Answers1

0

Do this.

public static void main(String[] args) throws IOException {
    Scanner scanner = new Scanner(System.in);
    Pattern p = Pattern.compile("([-+]?[0-9]+(?:\\.[0-9]+)?)");

    String[] tens = {"Ten", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
    String[] teens = {"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
        "Nineteen"};
    String[] ones = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};

    String phrase = null;
    while (scanner.hasNextLine()) {
        phrase = scanner.nextLine();
        // if input is an empty line, exit from loop
        if (phrase.isEmpty()) {
            break;
        }

        List<Integer> numbers = new ArrayList<>();
        Matcher m = p.matcher(phrase);
        while (m.find()) {
            numbers.add(Integer.parseInt(m.group()));
        }

        for (int i = 0; i < numbers.size(); i++) {
            if (numbers.get(i) >= 20) {
                if (numbers.get(i) % 10 == 0) {
                    phrase = phrase.replaceAll(Integer.toString(numbers.get(i)),
                            tens[((numbers.get(i) - numbers.get(i) % 10) / 10) - 1]);
                } else {
                    phrase = phrase.replaceAll(Integer.toString(numbers.get(i)),
                            (tens[((numbers.get(i) - numbers.get(i) % 10) / 10) - 1] + "-"
                            + ones[numbers.get(i) % 10]));
                }
            } else if (numbers.get(i) < 20 && numbers.get(i) > 10) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), teens[(numbers.get(i) % 10) - 1]);
            } else if (numbers.get(i) < 10 && numbers.get(i) > 0) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), ones[numbers.get(i)]);
            } else if (numbers.get(i) == 10) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), "Ten");
            } else if (numbers.get(i) == 0) {
                phrase = phrase.replaceAll(Integer.toString(numbers.get(i)), "Zero");
            }
        }
        System.out.println(phrase);
    }
}

Output

The speed limit is 40 mph, but you were going over 65
The speed limit is Fourty mph, but you were going over Sixty-Five
99 bottles of ...
Ninety-Nine bottles of ...
Wasi Ahmad
  • 35,739
  • 32
  • 114
  • 161