Обработка строк через преобразование в массив в Java
Всем привет! В данный момент я решаю следующую задачу: нужно реализовать публичный статический метод makeCensored(), который заменяет каждое вхождение указанного слова в предложении на последовательность $#%! и возвращает полученную строку.
Аргументы:
- Текст
- Стоп-слово
Словом считается любая непрерывная последовательность символов, включая любые спецсимволы (без пробелов)
Как программа должна работать:
var text1 = "When you play the game of thrones, you win or you die";
String[] stopWords1 = {"die", "play"};
var result1 = MyStringUtils.makeCensored(text1, stopWords1);
System.out.println(result1);
// => "When you $#%! the game of thrones, you win or you $#%!"
var text2 = "chicken chicken? chicken! chicken";
String[] stopWords2 = {"?", "chicken"};
var result2 = MyStringUtils.makeCensored(text2, stopWords2);
System.out.println(result2);
// => "$#%! chicken? chicken! $#%!
Указания к задаче:
- Разбить строку на массив слов можно при помощи метода split()
- Обратно собрать строку из массива можно при помощи метода join()
- Для проверки вхождения строки в массив используйте метод ArrayUtils.contains();
String[] words = {"hello", "world"};
ArrayUtils.contains(words, "hello"); // true
ArrayUtils.contains(words, "Jack"); // false
Моя попытка решения выглядит следующим образом:
import org.apache.commons.lang3.ArrayUtils;
public class MyStringUtils{
public static void main(String[] args){
}
public static String makeCensored(String text, String[] stopWords){
var words= text.split("");
String sequence="$#%!";
for(int i=0; i<words.length;i++){
words[i] = ArrayUtils.contains(stopwords, sequence);
}
return String.join(" ", StopWords);
}
}
Мне интересно услышать Ваши идеи и предложения по поводу этой задачи.
Ответы (1 шт):
Спустя несколько дней я все-таки разобрался в данной задаче.
Первое,и очень важное : метод contains() - это статический метод класса ArrayUtils, то есть он вызывается из класса ArrayUtils, а все данные для работы он получает через параметры ArrayUtils.contains(stopWords, words[i]).Таким образом,мы проверяем,содержит ли массив stopWords элемент words[i]
Второе: для эффективной конкатенации строк без создания дополнительных экземпляров класса String необходимо импортировать класс java.util.StringJoiner
Ниже привожу свое решение:
import org.apache.commons.lang3.ArrayUtils;
import java.util.StringJoiner;
public class MyStringUtils{
public static String makeCensored(String text, String[] stopWords){
var words= text.split(" ");
String sequence="$#%!";
StringJoiner joiner = new StringJoiner(" ");
for(int i=0; i<words.length;i++){
joiner.add(ArrayUtils.contains(stopWords, words[i])?sequence:words[i]);
}
return joiner.toString();
}
}