Создание метода, чтобы заменить "сэр" на "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" в индексе.