Обработка строк через преобразование в массив в 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 шт):

Автор решения: Pete Alexandrovich

Спустя несколько дней я все-таки разобрался в данной задаче.

Первое,и очень важное : метод 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();
 }
}
→ Ссылка