0

我制作了一个程序,旨在运行文本文档(莎士比亚的李尔王)并将字母 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

4 回答 4

2

无需重新发明轮子。只是使用String.replace而不是使事情复杂化。

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

到目前为止,您拥有的所有替换逻辑都可以重写为:

line = line.replace("s", "z").replace("S", "Z").replace("sir", "dawg");
于 2014-10-28T01:14:07.547 回答
0

当您遍历每一行时,您逐个字符地进行。就在这儿:

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++)

现在它不会读得太远。这应该可以解决您的问题。希望这可以帮助 :)

编辑:这应该解释你的错误,它只是有 dawgs。

要修复它只是打印 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
    }

}

使用这种方法,它应该可以按照您的意愿工作。然而,就像 Robby Cornelissen 所说的那样,我会研究这个String.replace()函数,因为它非常有用并且更具可读性。

于 2014-10-28T01:16:12.943 回答
0

在你的 for 循环中,你真的会得到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”访问数组中的索引。

于 2014-10-28T01:16:21.833 回答
0

很难说出导致异常的原因。仅通过查看代码似乎这一行可能会导致问题

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

请注意,您正在检查位置 i+1 和 i+2 的每个 i。这将导致 ArrayOutOfBoundsExceptioni = line.length-1i = line.length-2

于 2014-10-28T01:18:18.410 回答