将单词转换为Pig Latin时如何保留标点符号?

时间:2016-09-18 00:56:27

标签: java

我一直致力于Java程序,将英语单词转换为Pig Latin。我已经完成了所有基本规则,例如附加-ay,-way等,以及特殊情况,例如问题 - > estionquay,押韵 - > ymerhay,我也处理过大写(Thomas - > Omasthay)。但是,我有一个问题,我似乎无法解决:我需要保留标点之前和之后。例如,什么? - > Atwhay?哦 - > Ohway! “你好” - > “ellohay”和“你好!” - > “Ellohay!”顺便说一句,这不是重复的,我检查了大量的猪拉丁问题,我似乎无法弄清楚如何做到这一点。

到目前为止,这是我的代码(我删除了所有标点符号,但无法弄清楚如何将其重新插入):

public static String scrub(String s)
{
 String punct = ".,?!:;\"(){}[]<>";
 String temp = "";
 String pigged = "";
 int index, index1, index2, index3 = 0;

 for(int i = 0; i < s.length(); i++)
 {
  if(punct.indexOf(s.charAt(i)) == -1) //if s has no punctuation
  {
   temp+= s.charAt(i);
  }
 } //temp equals word without punctuation
 pigged = pig(temp); //pig is the piglatin-translator method that I have already written, 
 //didn't want to put it here because it's almost 200 lines

 for(int x = 0; x < s.length(); x++)
 {
  if(s.indexOf(punct)!= -1)//punctuation exists
   {
    index = x; 
   }
 }
}

我从理论上说你可以在字符串中搜索标点符号并且它应该在开头或结尾附近,所以你必须存储索引并在它被“piglatenized”之后替换它,但我一直感到困惑for循环部分。如果你在for循环中做index = x,那么每次循环运行时你只需要替换索引。 帮助将非常感激!另外,请记住我不能使用快捷方式,我可以使用String方法等但不是像Collections或ArrayLists这样的东西(不是你在这里需要它们),我必须重新发明轮子,基本上。 顺便说一下,如果不清楚的话,我已经把翻译成了一些东西。我只需要在翻译之前和之后保留标点符号。

3 个答案:

答案 0 :(得分:1)

如果允许使用正则表达式,则可以使用以下代码。

String pigSentence(String sentence) {
  Matcher m = Pattern.compile("\\p{L}+").matcher(sentence);
  StringBuffer sb = new StringBuffer();
  while (m.find()) {
    m.appendReplacement(pig(m.group()));
  }
  m.appendTail();
  return sb.toString();
}

用简单的英文,上面的代码是:

for each word in the sentence:
  replace it with pig(word)

但是如果禁止使用正则表达式,你可以试试这个:

String pigSentence(String sentence) {
  char[] chars = sentence.toCharArray();
  int i = 0, len = chars.length;
  StringBuilder sb = new StringBuilder();

  while (i < len) {

    while (i < len && !Character.isLetter(chars[i]))
      sb.append(chars[i++]);
    int wordStart = i;

    while (i < len && Character.isLetter(chars[i]))
      i++;
    int wordEnd = i;

    if (wordStart != wordEnd) {
      String word = sentence.substring(wordStart, wordEnd - wordStart);
      sb.append(pig(word));
    }
  }

  return sb.toString();
}

答案 1 :(得分:0)

您需要做的是:删除标点符号(如果存在),转换为猪拉丁语,添加标点符号。

假设标点符号始终是字符串的结尾,您可以使用以下内容检查标点符号:

String punctuation = "";
for (int i = str.length() - 1; i > 0; i--) {
    if (!Character.isLetter(str.charAt(i))) {
        punctuation = str.charAt(i) + punctuation;
    } else {
        break; // Found all punctuation
    }
}
str = str.substring(0, str.length() - punctuation.length()); // Remove punctuation
// Convert str to pig latin
// Append punctuation to str

答案 2 :(得分:0)

我觉得处理与翻译分开的标点符号很麻烦。对于开头或结尾的标点符号,您可以保存它们并在翻译后重新标记它们。

但是如果你从单词的中间删除标点,那么将它们替换回正确的位置将会非常困难。他们的指数从原始单词变为有关单词,并且变量可变。 (对于一些随机的例子,考虑“Hel'lo”和“Quest'ion”。撇号左移1或2,你不知道哪个。)

您的翻译方法如何处理标点符号?在将它传递给翻译者之前,你真的需要删除所有标点符号吗?我建议让你的清管方法至少处理单词中间的标点符号。