【问题标题】:How to preserve the punctuation when converting words to Pig Latin?将单词转换为 Pig Latin 时如何保留标点符号?
【发布时间】:2016-09-18 00:56:27
【问题描述】:

我一直在开发一个将英语单词转换为 Pig Latin 的 Java 程序。我已经完成了所有基本规则,例如附加 -ay、-way 等,以及特殊情况,例如 question -> estionquay、rhyme -> ymerhay,并且我还处理了大写(Thomas -> Omasthay)。但是,我有一个似乎无法解决的问题:我需要保留前后标点符号。例如,什么? -> 阿特威?哦!->哦! “你好”->“hellohay”和“你好!” -> “你好!”顺便说一句,这不是重复的,我已经检查了很多猪拉丁问题,但我似乎不知道该怎么做。

到目前为止,这是我的代码(我已经删除了所有标点符号,但不知道如何将其放回原处):

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 ,那么每次循环运行时你只是在替换 index 。 帮助将不胜感激!另外,请记住我不能使用快捷方式,我可以使用 String 方法等,但不能使用 Collections 或 ArrayLists 之类的东西(不是你在这里需要它们),基本上我必须重新发明轮子。 顺便说一句,如果不清楚,我已经把翻译成piglatin 的东西记下来了。我只需要在翻译前后保留标点符号。

【问题讨论】:

  • 您是否将单个单词或句子传递给此函数?
  • 一个字,谢天谢地
  • 您是要从单词中间去掉标点符号还是只去掉开头和/或结尾的标点符号?
  • @Lucas Kot-Zaniewski 如果它在英语中位于单词的中间,那么我希望相同的标点符号在 PigLatin 单词中的相同位置。例如,Apple!ple 应该是 Apple!pleway,而 What!应该是Atwhay!感叹号与原来的位置相同。
  • 如果是 w!what,应该是 atw!hay 还是 a!twhay?如果你想要第一种方式,那么你可以将标点符号视为辅音簇的一部分,这样你就不必知道位置。

标签: java


【解决方案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();
}

【讨论】:

    【解决方案2】:

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

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

    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
    

    【讨论】:

    • 总是在结尾,如开头和结尾,还是只是字符串的结尾?
    • 字符串结束。 (例如,你好!!->你好,!你好!->!你好)
    • 但我的问题是如何将它附加到同一个地方,而这没有包含在你的答案中
    • 您没有提供显示如何将字符串重新组合在一起的代码,因此很难弄清楚您在问什么。
    【解决方案3】:

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

    但是,如果您从单词中间删除标点符号,则很难将它们替换回正确的位置。它们的索引从原始单词到被清空的单词,并且变化量可变。 (对于一些随机的例子,考虑“Hel'lo”和“Quest'ion”。撇号向左移动 1 或 2,你不会知道是哪个。)

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

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      相关资源
      最近更新 更多