读入一个句子并只打印出相同字母连续重复 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(", ")));
}
我想制作一个程序,在其中只背对背重复具有 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(", ")));
}