#java #java.util.scanner
#java #java.util.scanner
Вопрос:
Я хотел создать программу, в которой повторяются только слова, содержащие 3 одинаковые буквы подряд. например, mooonkey raaan через mounnntains. программа должна повторять только 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] ", ");
}
}
}
вместо этого программа просто ничего не повторяет.
Ответ №1:
Ваш код почти правильный, единственная логическая ошибка, которую вы допустили, находится внутри вашего внутреннего цикла, вы продолжаете сбрасывать переменную счетчика, как только найдете другую букву:
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;
}
Ответ №2:
Поскольку вы ищете последовательные буквы, вы хотите начать с char i
, а затем сравнить char at i
с char at i 1
и at i 2
. Если все они равны, то у нас есть совпадение, и мы можем продолжить.
Вы можете упростить всю функцию, например:
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]) amp;amp; (word[i] == word[i 2])) {
tripleLetter.add(s);
break;
}
}
}
System.out.println(tripleLetter.stream().collect(Collectors.joining(", ")));
}
Ответ №3:
Позвольте мне предложить решение, которое немного отличается от вашего и не использует счетчик.
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] amp;amp; word[s] == word[s 2]) {
System.out.print(sentence[i] ", ");
break;
}
}
}
Проверьте, совпадает ли текущая буква в текущем слове со следующей буквой и с буквой после следующей буквы. Если условие выполняется, то выведите текущее слово и перейдите к следующему слову в предложении.
Ответ №4:
Что ж, если вы просто ищете более короткую версию этого, попробуйте это.
- сначала разделите предложение на один или несколько пробелов (вы должны делать это независимо).
- поток массива и фильтрация по одному символу, за которым следуют те же два символа через обратную ссылку на группу захвата (см. Для этого регулярные выражения).
- И распечатайте их.
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