#java #arrays
#java #массивы
Вопрос:
Мне нужно найти слово в строке, которое является как самым длинным, так и четным. Несколько примеров:
Предложение Time to construct great art
. Это должно вернуть строку time
, потому что это even
слово наибольшей длины, при этом длина равна 4
, это не construct
потому, что construct — это длина 9
, которая является нечетной.
Кроме того, в примере Time to write great code
. Это должно вернуть строку Time
, потому что она четная и имеет четную длину 4
. Оно не вернет слово code
, потому Time
что встречается первым.
String[] array = sentence.split(" ");
String longestWord = " ";
for (int i = 0; i < array.length; i ) {
if (array[i].length() >= longestWord.length()) {
longestWord = array[i];
}
}
System.out.println(longestWord);
Мой код успешно печатает самое длинное слово, однако не учитывает, является ли длина самой длинной строки четной и встречается ли она первой.
Я попытался использовать некоторые символы модуля в моем цикле for, но он не отслеживает, является ли наибольшее слово четным, если нет, перейдите к следующему наибольшему слову.
Кроме того, мне трудно отслеживать, идет ли слово первым или нет.
Что я пробовал для учета четного:
for (int i = 0; i < array.length; i ) {
if (array[i].length() >= longestWord.length()) {
longestWord = array[i];
if (longestWord.length() % 2 != 0) {
break;
}
else {
longestWord = array[i];
}
}
}
Комментарии:
1. Чтобы исправить ошибку «Самое длинное слово приходит первым», вам следует взглянуть на то, как вы сравниваете длины. Я пока не хочу излагать это полностью, так как это похоже на учебное упражнение, и я хочу, чтобы вы нашли ответ самостоятельно, но ответьте, если вам трудно.
2.
Pattern.compile("\p{L} ").matcher(input).results().map(MatchResult::group).filter(s -> (s.length() amp; 1) == 0).max(Comparator.comparing(String::length)).orElse(" ")
Ответ №1:
Вы можете использовать оператор modulo ( %
), чтобы проверить, четна ли длина строки:
string.length() % 2 == 0
Для завершения этого вы можете использовать Arrays.stream()
, чтобы найти самую длинную строку с четной длиной:
String longestWord = Arrays.stream(sentence.split(" ")) // creates the stream with words
.filter(s -> s.length() % 2 == 0) // filters only the even length strings
.max(Comparator.comparingInt(String::length)) // finds the string with the max length
.orElse(" "); // returns " " if none string is found
Ответ №2:
Изменения заключаются в том, что вы сравниваете> с самой длинной длиной, а не>= и проверяете, является ли длина четной.
Чтобы учесть случаи, когда есть другие символы, такие как ‘.’, используйте шаблоны регулярных выражений.
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "I am good.";
String[] input_words = input.split(" ");
String longestWord = " ";
for(String word : input_words) {
Pattern p = Pattern.compile("^[a-zA-Z] ");
Matcher m = p.matcher(word);
m.find();
if(m.group().length() % 2 == 0 amp;amp; m.group().length() > longestWord.length()) {
longestWord = m.group();
}
}
System.out.println("result : " longestWord);
}
При этом будет выведено наибольшее первое встречающееся четное слово
Комментарии:
1. Добро пожаловать @JohnEgg
2. Это не будет работать при вводе
"I am good."
, поскольку приведет к"am"
вместо"good"
. Обычно на входных данных, где самое длинное четное слово расположено перед знаком препинания.3. @JohnEgg если вам нужно это учитывать, лучше использовать подход регулярных выражений. Я скоро обновлю ответ
4. @JohnEgg Я обновил ответ регулярным выражением, проверьте
Ответ №3:
Использование оператора % (по модулю) является распространенным способом оценки того, является ли число четным или нечетным, путем проверки, вызывает ли деление на 2 остаток. Вы бы использовали его здесь следующим образом:
if (array[i].length() >= longestWord.length() amp;amp; array[i].length() % 2 == 0) {
longestWord = array[i];
}
Редактировать: Мне плохо, потому что это звучит как задание, поэтому я не буду решать «первую» часть проблемы.
Комментарии:
1. Спасибо, это действительно помогло!
Ответ №4:
public class HelloWorld {
public static void main(String []args) {
String sentence = "this is a sample input for the problem";
String arr[] = sentence.split("\s "); // to split the sentence by space (because words are separated by space)
int len = 0;
String word = "";
for (int i= 0; i< arr.length; i ) {
if((arr[i].length())%2 == 0) { // check if the length of the word is even
int len1 = arr[i].length();
if (len1 > len ) { // if new length is greater than the previous word's length then assign the value of new length to len variable
len = len1;
word = arr[i]; // word = highest length word
}
}
}
System.out.println(word);
}
}
Комментарии:
1. пожалуйста, объясните логику и добавьте комментарии к коду, чтобы выделить логику.
2. @Anand vidvat — просто разделите предложение с помощью функции разделения, где разделителем является пробел.. После разделения у нас будет массив слов. Повторите массив с помощью цикла for и проверьте длину каждого слова.. Я использовал оператор по модулю, чтобы проверить, является ли длина четной, т.е. Остаток должен быть равен нулю. Теперь проверьте, не меньше ли длина предыдущего слова, чем длина текущего слова. Если true, то обновите значение переменной Len, потому что нам нужно найти максимальную длину.. В конце верните результат
3. не могли бы вы добавить это к своему ответу, чтобы сделать его более понятным.
Ответ №5:
public static void main(String[] args) { // Автоматически сгенерированный заглушка метода TODO
String input = "I am good.";
String[] input_words = input.split(" ");
String longestWord = " ";
for(String word : input_words) {
Pattern p = Pattern.compile("^[a-zA-Z] ");
Matcher m = p.matcher(word);
m.find();
if(m.group().length() % 2 == 0 amp;amp; m.group().length() > longestWord.length()) {
longestWord = m.group();
}
}
System.out.println("result : " longestWord);
}
Ответ №6:
public class LongestEvenString {
public static void main(String[] args) {
String test = "this is a sample input for the problem";
System.out.println(longestEvenString(test));
}
public static String longestEvenString(String test) {
// Splits a sentence to array of Strings.
String[] words = test.split(" ");
// curlen stores length of current word in string Array
// maxlen stores length of maximum_length word in string Array
int curlen = 0;
int maxlen = 0;
String output = "";
for (String word:words) {
curlen = word.length();
// loop runs only if length of the current word is more than
// maximum_length thus excluding future same maximum_length words.
// and also checks for even_length of that word
if(curlen > maxlen amp;amp; curlen%2 == 0){
maxlen = curlen;
output = word;
}
}
// returns maximum_even_length word which occurred first
return output;
}
}
Ответ №7:
открытый класс FindLongestEvenWord {
public static void main(String[] args) {
String s = "Be not afraid of greatness some are born great some achieve greatness";
List<String> strList = Arrays.asList(s.trim().split(" "));
Optional<String> maxLengthEvenWord = strList.stream().filter(s3->s3.length()%2==0).reduce((s1,s2)->s1.length()>s2.length()?s1:s2);
if(maxLengthEvenWord.isPresent())
System.out.println(maxLengthEvenWord.get());
}
}
Комментарии:
1. Пожалуйста, разместите сообщение с блоком кода правильно. А также попытайтесь объяснить в нескольких словах
Ответ №8:
Решение вопроса в python:
def longestevenword(sentence):
#converting the sentence into lists
string_list = sentence.split()
size = 0
#iteration through each word in the list
for word in string_list:
#check to see if the word has even number of characters
if len(word)%2 == 0:
#checking if the length of the of the word
if size <= len(word):
size = len(word)
even_word = word
else:
continue
# printing the longest even word in a given sentence.
print(even_word)
## function call to test
longestevenword("This is a cat that had a puppyy")
Output: puppyy
Это также доступно на моем GitHub https://github.com/jaikishpai/CommonSolutions/blob/main/LongestEvenWord.py