读入一个句子并只打印出相同字母连续重复 3 次或更多次的单词

Read in a sentence and print out only words that have the same letter repeated 3 or more times in a row

我想制作一个程序,在其中只背对背重复具有 3 个相同字母的单词。例如,moonkey raaan 穿过山脉。该程序应该只重复 mooonkey,raaan

public class Triplets2 {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    System.out.println("write a sentence");
    String in = input.nextLine();
    
    String [] sentence = in.split(" ");
    
    for (int i = 0; i < sentence.length; i++) {
        
        char [] word = sentence[i].toCharArray();
        int counter =0;
        
        for (int s = 0; s < word.length; s++) {
            
            char letter = word[s];
            
            for (int x = 0; x<word.length; x++) {
                
                if (letter == word[x]) {
                    counter++;
                }
                    else {
                        counter = 0;
                }
            }
        }
        if (counter >=3) {
            System.out.print(sentence[i] + ",  ");
        }
    }
}

程序只是不重复任何内容。

好吧,如果您只是在寻找一个较短的版本,那么试试这个。

  • 首先,将句子分成一个或多个白色 space 字符(无论如何你都应该这样做)。
  • 流式传输数组并过滤单个字符,然后通过对捕获组的反向引用来过滤相同的两个字符(参见 regular expressions)。
  • 并打印出来。
String str =
        "Thiiis is aaaa tesssst of finding worrrrds with more than threeeeee letteeeeers";

Arrays.stream(str.split("\s+"))
        .filter(s -> s.matches(".*(.)\1\1.*"))
        .forEach(System.out::println);

版画

Thiiis
aaaa
tesssst
worrrrds
threeeeee
letteeeeers
        

你的代码几乎是正确的,你犯的唯一逻辑错误是在你的内部循环中,你一发现不同的字母就不断地重置你的计数器变量:

if (letter == word[x]) {
    counter++;
} else {
    counter = 0;
}

因此,当您遍历“raaan”这样的词时,您的计数器会在到达字符串的末尾时重置,因为“n”只存在一次。 这意味着您将只能检测到最后有 3 个连续字母的单词(例如“Hooo”)。

解决方法很简单: 一旦你在一个单词中找到 3 个连续的字母,你就可以停止迭代并检查单词的其余部分。那时你已经知道它符合你的标准:

if (letter == word[x]) {
    counter++;
    if(counter >= 3) break; // stop inner loop checking once we found 3 letters
} else {
    counter = 0;
}

请允许我提出一个与您略有不同且不使用计数器的解决方案。

Scanner input = new Scanner(System.in);
System.out.println("write a sentence");
String in = input.nextLine();
String[] sentence = in.split(" ");
for (int i = 0; i < sentence.length; i++) {
    char[] word = sentence[i].toCharArray();
    for (int s = 0; s < word.length - 2; s++) {
        if (word[s] == word[s + 1] && word[s] == word[s + 2]) {
            System.out.print(sentence[i] + ",  ");
            break;
        }
    }
}

检查当前单词中的当前字母是否与下一个字母相同,是否与下一个字母之后的字母相同。如果条件成立,则打印当前单词并继续处理句子中的下一个单词。

由于您要查找连续的字母,因此您希望从 char i 开始,然后将 i 处的 char 与 i+1 处和 i+2 处的 char 进行比较。如果它们都相等,那么我们就有一个匹配项并可以继续。

您可以简化整个函数,例如:

public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  System.out.println("write a sentence");
  String in = input.nextLine();

  List<String> tripleLetter = new ArrayList<>();
  for (String s : in.split(" ")) {
    char[] word = s.toCharArray();
    for (int i = 0; i < word.length - 2; i++) {
      if ((word[i] == word[i+1]) && (word[i] == word[i+2])) {
        tripleLetter.add(s);
        break;
      }
    }
  }

  System.out.println(tripleLetter.stream().collect(Collectors.joining(", ")));
}