Я пытаюсь использовать сканер с несколькими строками и пытаюсь изменить ввод с помощью другой строки java - PullRequest
0 голосов
/ 01 мая 2020

Итак, я пытаюсь создать программу, которая спросит вас, что вы хотите изменить, и она спросит вас, что вы собираетесь изменить. Лучший способ объяснить это, скажем, у меня есть куча 1234 в моей строке, и я хотел бы изменить их все на «WASD» (имейте в виду, что эти многострочные входы хранятся в ArrayList). Тем не менее, моя программа, кажется, не работает, она не дает мне вывод обратно, как только я введу данные.

ЭТО МОЙ КОД (извините, я не соблюдаю соглашения об именах, но надеюсь, вы сможете получить общее представление)

package com.far.main;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class findandreplace {

    static String inputLocation;

    static String inputChange;

    static String data;

    static List<String>test1 = new ArrayList<String>();
    findandreplace(){



    }

    public static void findthanreplace() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter what string YOU WANT TO REPLACE");
        String input = scanner.nextLine();

        inputLocation = input;

        System.out.println("Enter the DATA you want to replace WITH");
        String inputDataChange = scanner.nextLine();

        inputDataChange = inputChange;

        returnInput();
    }

    public static void returnInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter in the data");

        while (scanner.hasNextLine()) {
            List<String> test = new ArrayList<>();
            Scanner scanner1 = new Scanner(scanner.nextLine());
            while (scanner1.hasNext()) {
                test.add(scanner1.next());
            }
            test = test1;
        }

        finalResult();
    }


    public static void finalResult() {
        System.out.println();
        System.out.println();

        System.out.println(Collections.replaceAll(test1, inputLocation, inputChange));
        System.out.println(test1);
    }
    public static void main(String[] args) {
        findthanreplace();

    }

}

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

В вашем коде несколько проблем. Они должны быть исправлены, чтобы получить ожидаемые результаты

  • Вы не предоставляете условие, которое заставляет ломать l oop, который принимает входные данные от пользователя.
  • Вы используете Collections.replaceAll(), который не удовлетворяет вашим требованиям. Как я понимаю, вам нужно заменить подстроку другой, а не элемент с другой. Таким образом, Collections.replaceAll() это не то, что вам нужно в этом случае.
  • Вы инициализируете Scanner объект внутри al oop, и это не очень хорошая практика.
  • У вас есть несколько избыточные назначения переменных. Некоторые из них даже не используются. Так что убери их. Пример: test = test1;

Вот одно из возможных решений, позволяющее избежать вышеуказанных проблем, но, похоже, его можно оптимизировать и в дальнейшем.

    static String inputLocation;
    static String inputChange;
    static List<String> test1 = new ArrayList<String>();

    public static void findthanreplace()
    {
        Scanner scanner = new Scanner( System.in );
        System.out.println( "Enter what string YOU WANT TO REPLACE" );
        inputLocation = scanner.nextLine();

        System.out.println( "Enter the DATA you want to replace WITH" );
        inputChange = scanner.nextLine();

        returnInput();
    }

    public static void returnInput()
    {
        Scanner scanner = new Scanner( System.in );
        System.out.println( "Enter in the data" );
        while( scanner.hasNextLine() )
        {
            String input = scanner.nextLine();
            if( input.equalsIgnoreCase( "DONE" ) ) // Impose a condition to break from this loop, Ex : This loop breaks once user input is DONE
                break;
            test1.add( input );
        }

        finalResult();
    }


    public static void finalResult()
    {
        System.out.println();
        System.out.println();

        for( int i = 0; i < test1.size(); i++ )
        {
// This line converts the inputs to lowercase and find the starting index of first appearance of the string that needs to be replaced.
            Matcher m = Pattern.compile( inputLocation.toLowerCase() ).matcher( test1.get( i ).toLowerCase() );
            while( m.find() )
            {
                int startIndex = m.start();
            // Replace the substring with the desired replacement and add that to list
                String replacedString = test1.get( i ).replace( test1.get( i ).substring( startIndex, inputLocation.length() ), inputChange );                String firstMatch = m.group();
                test1.set( i, replacedString );
            }
        }
        System.out.println( test1 );
    }

    public static void main( String[] args )
    {
        findthanreplace();
    }
0 голосов
/ 01 мая 2020

по моему мнению, ваш код представляет собой какую-то проблему, например 1) этот код отображает вам одну строку и заменяет ее, поэтому вы должны написать break; end of while (scanner.hasNextLine()) scope, потому что компилятор никогда не завершает работу с while. в противном случае вы хотите несколько строк, вы можете получить размер введенного кода, а если размер пустого разрыва 2) вы должны заменить test1 = test; вместо test = test1; 3) вы можете напечатать элементы списка как test1.forEach(n-> System.out.print(n.concat(" "))); вместо System.out.println(test1);

, поэтому я изменяю ваш код, как показано ниже

public static void returnInput() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter in the data");
    while (scanner.hasNextLine()) {
        List<String> test = new ArrayList<>();
        Scanner scanner1 = new Scanner(scanner.nextLine());
        while (scanner1.hasNext()) {
            test.add(scanner1.next());
        }
        if(test.isEmpty())
            break;
        test1 .addAll(test);
    }

    finalResult();
}


public static void finalResult() {
    System.out.println();
    System.out.println();

    System.out.println(Collections.replaceAll(test1, inputLocation, inputChange));
    test1.forEach(n-> System.out.print(n.concat(" ")));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...