Как сделать вывод в обратном порядке, используя язык Java? - PullRequest
1 голос
/ 06 октября 2019

У меня проблема с переносом всех строк из стандартного ввода и записью их в стандартный вывод в обратном порядке. То есть вывод каждой строки в обратном порядке ввода.

Ниже мой код:

  import java.util.Scanner;

  public class ReverseOrderProgram {
   public static void main(String args[]) {
    //get input
    Scanner sc = new Scanner(System.in);
    System.out.println("Type some text with line breaks, end by 
    \"-1\":");
    String append = "";
    while (sc.hasNextLine()) {
        String input = sc.nextLine();
        if ("-1".equals(input)) {
            break;
        }
        append += input + " ";
    }
    sc.close();
    System.out.println("The current append: " + append);
    String stringArray[] = append.split(" strings" + "");



    System.out.println("\n\nThe reverse order is:\n");

    for (int i = 0; i < stringArray.length; i++) {

        System.out.println(stringArray[i]);
    }
   }
  }

Когда я запускаю свой код с примерами ввода, как показано ниже:

  Type some text with line breaks, end by "-1":
  My name is John.
  David is my best friend.
  James also is my best friend.
  -1

Я получаю следующий вывод:

  The current append: My name is John. David is my best friend. James also is my best friend.


  The reverse order is:

  My name is John. David is my best friend. James also is my best friend.

Принимая во внимание, что требуемый вывод выглядит примерно так:

  The current append: My name is John. David is my best friend. James also is my best friend.


  The reverse order is:

  James also is my best friend.
  David is my best friend. 
  My name is John.

Может кто-нибудь помочь мне проверить, что не так с моим кодом и исправить это?

Ответы [ 6 ]

3 голосов
/ 06 октября 2019

Попробуйте приведенный ниже код.

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

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

    Scanner sc = new Scanner(System.in);
    System.out.println("Type some text with line breaks, end by\"-1\":");
    List<String> list= new LinkedList<String>();
    String append = "";
    while (sc.hasNextLine()) {
        String input = sc.nextLine();
        if ("-1".equals(input)) {
            break;
        }
        list.add(input);
    }
    sc.close();
    System.out.println("The current append: " + append);

    Collections.reverse(list);
    for (String string : list) {
        System.out.println(string);
    }
  }
}

Надеюсь, это поможет вам

2 голосов
/ 06 октября 2019

Вместо добавления ввода к строке append необходимо добавить строку ввода в Список , а затем распечатать ее снизу или использовать *Метод 1007 * Collections.reverse () , а затем распечатайте его прямо

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

Вы можете использовать Collections.reverse(), как подсказывают другие ответы. Но стандартный способ реверса выполняется с помощью Stack. Stack - это структура данных LIFO, которая точно демонстрирует ваше требуемое поведение. Вам нужно будет подтолкнуть все свои результаты к Stack и pop, пока Stack не станет empty. Пример нижеприведенного фрагмента даст вам набросок.

String input = " Hello \n World \n Here you go";
List<String> inputList = Arrays.asList(input.split("\n"));
        Stack<String> myStringStack = new Stack<>();
        myStringStack.addAll(inputList); // This is to exhibit your input scenario from user.
        while (!myStringStack.isEmpty()) { // While your stack is not empty, keep popping!
            System.out.println(myStringStack.pop());
         }
0 голосов
/ 06 октября 2019

Вы можете использовать структуру данных стека, которая имеет поведение LIFO для вставки и чтения элементов. Более полной реализацией стека Java является Deque, у которого есть метод "downndingOrder", который возвращает итератор элементов в обратном порядке.

        Deque deque = new LinkedList();

        // We can add elements to the queue in various ways
        deque.add("Element 1 (Tail)"); // add to tail
        deque.addFirst("Element 2 (Head)");
        deque.addLast("Element 3 (Tail)");
        deque.push("Element 4 (Head)"); //add to head
        deque.offer("Element 5 (Tail)");
        deque.offerFirst("Element 6 (Head)");
        deque.offerLast("Element 7 (Tail)");

        Iterator reverse = deque.descendingIterator();
        System.out.println("Iterating over Deque with Reverse Iterator");
        while (reverse.hasNext()) {
            System.out.println("\t" + reverse.next());
        }

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

Редактировать - в основном та же реализация, что и в предыдущих ответах, хотя используется цикл for:

import java.util.ArrayList;
import java.util.Scanner;

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

    //create arraylist for lines
    ArrayList<String> lines = new ArrayList<String>();
    //get input

    Scanner sc = new Scanner(System.in);
    System.out.println("Type some text with line breaks, end by \"-1\":");
    String append = "";
    while (sc.hasNextLine()) {
        String input = sc.nextLine();
        if ("-1".equals(input)) {
            break;
        }
        lines.add(input);
    }

    sc.close();
    System.out.println("The current append: ");
    for(String line : lines){
        System.out.print(line + ". ");
    }

    System.out.println("\n\nThe reverse order is:\n");

    for (int i = lines.size()-1; i >=0 ; i--) {
        System.out.println(lines.get(i));
    }
}
}
0 голосов
/ 06 октября 2019

1 - 1 способ сделать это - запустить цикл из обратного слова.

for (int i = stringArray.length; i >=0 ; i++) {

    System.out.println(stringArray[i]);
}

2 - Использовать метод Collections.reverse () в списке и распечатать его. как

    List<String> list = Arrays.asList(stringArray); 

    Collections.reverse(list ); 

    System.out.println("Modified List: " + list ); 
...