Создание метода, чтобы заменить "сэр" на "dawg"?

Я создал программу, предназначенную для работы с текстовым документом ("Король Лир" Шекспира) и замену всех букв "s" на "z" и "sir" на "dawg". У меня работает первый метод, но у меня возникают проблемы с выяснением, в чем проблема с моим другим методом (предназначенным для замены "сэр").

Все выглядит хорошо, но он продолжает говорить "Вне границ". Какие-либо предложения / ошибки в моем коде?

import java.util.Scanner;
import java.io.*;
public class KingLear
{
public static void main (String[] args) throws FileNotFoundException
{
    PrintStream ps = new PrintStream("new_lear.txt");
    Scanner fileScan = new Scanner(new File("king_lear.txt"));
    Scanner fileScan2 = new Scanner(new File("king_lear.txt"));
    String currentLine;
    String currentLine2;

    while (fileScan2.hasNextLine())
    {
        currentLine2 = fileScan.nextLine();

        ps.println(dawg(currentLine2));
    }


    while (fileScan.hasNextLine())
    {    
        currentLine  = fileScan.nextLine();

        ps.println(zReplace(currentLine));

    }
   }
  public static String zReplace (String line)
  {
    String newLine = "";
    for (int i = 0; i < line.length(); i++)
    {
        char letter = line.charAt(i+1);
        if (letter == 's')
            newLine += 'z';
        else if (letter == 'S')
            newLine += 'Z';
        else 
            newLine += letter;
    }
    return newLine;
}

public static String dawg (String line)
{
    String newLine = "   ";
    for (int i = 0; i < line.length(); i++)
    {
        char letter = line.charAt(i);
        if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')
        {
            newLine +="dawg";
        }

    }
    return newLine;
}
}

4 ответа

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

line = line.replace("sir", "dawg");

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

line = line.replace("s", "z").replace("S", "Z").replace("sir", "dawg");

Когда вы проходите каждую строку, вы идете чарм за чарсом. Прямо здесь:

for (int i = 0; i < line.length(); i++)
{
    char letter = line.charAt(i);
    if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')
    {
        newLine +="dawg";
    }

}

Но если вы на последнем символе. Это будет читать:

i = line.length() - 1;
char letter = line.charAt(i);
if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')
{
    newLine +="dawg";
}

Это проблема, потому что line.charAt(i+2) будет проверять на наличие символа, который не существует. (это на самом деле 2 места слишком далеко.)

Чтобы исправить это изменение:

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

чтобы:

for (int i = 0; i < line.length() - 2; i++)

Теперь это не будет читать слишком далеко. Это должно исправить вашу проблему. Надеюсь это поможет:)

Редактировать: это должно объяснить вашу ошибку с этим, просто имея гадости.

Чтобы исправить ошибку, просто печатая dawg, вам также нужно добавить другие буквы к newLine как это:

for (int i = 0; i < line.length() - 2; i++)
{
    char letter = line.charAt(i);
    if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')
    {
        newLine += "dawg";
        i += 3;
    }
    else if (i == line.length() - 3){ // checks if this is the last possible dawg
        newLine += line.charAt(i);
        newLine += line.charAt(i + 1);
        newLine += line.charAt(i + 2); // adds the last 3 chars to the string
    }
    else{
        newLine += line.charAt(i); // adds text other than dawg to newLine
    }

}

Используя этот метод, он должен работать так, как вы хотите. Как бы ни говорил Робби Корнелиссен, я посмотрю в String.replace() функция, потому что это может быть очень полезным и гораздо более читабельным.

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

if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')

Обратите внимание, что для каждого i вы проверяете позиции i+1 и i+2. Это приведет к ArrayOutOfBoundsException, когда i = line.length-1 или же i = line.length-2

В вашем цикле вы действительно получите outofbounds

String newLine = "";
for (int i = 0; i < line.length(); i++)
{
    //in this line
    char letter = line.charAt(i+1);
    if (letter == 's')
        newLine += 'z';
    else if (letter == 'S')
        newLine += 'Z';
    else 
        newLine += letter;
}

измените это на:

// minus another 1 index
for (int i = 0; i < line.length() - 1; i++)
{
    //in this line
    char letter = line.charAt(i+1);
    if (letter == 's')
        newLine += 'z';
    else if (letter == 'S')
        newLine += 'Z';
    else 
        newLine += letter;
}

и для вашей функции "dawg" измените ее тоже:

String newLine = "   ";
    //minus 2 index
    for (int i = 0; i < line.length()-2; i++)
    {
        char letter = line.charAt(i);
        if (line.charAt(i) == 's' && line.charAt(i+1) == 'i' && line.charAt(i+2) == 'r')
        {
            newLine +="dawg";
        }

    }

вы выходите за пределы, потому что вы получаете доступ к индексу из массива, используя те "+1 или +2" в индексе.

Другие вопросы по тегам