Для понимания кода:
Я использую StringBuilder и StringBuffer классы для модификации строки.
Метод StringBuilder.charAt(int); возвращает конкретный char из строки, метод StringBuffer.replace(int a, int b, String str); удаляет элементы с a по b, и вставляет на их место str. Все остальное прокомментировано в коде.
Валидатор просит проверить, что я 2 раза использую System.setOut(); что я сделал;
Лекция по этой теме: https://javarush.com/quests/lectures/questcore.level09.lecture07
package com.javarush.task.task19.task1912;
import java.util.*;
import java.io.*;
public class Solution {
public static TestString testString = new TestString();
public static void main(String[] args) {
PrintStream consoleStream = System.out;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//создаем адаптер к классу PrintStream
PrintStream stream = new PrintStream(outputStream);
//Устанавливаем его как текущий System.out
System.setOut(stream);
//Подменяем и восстанавливаем поток вывода в консоль объекта System.out.
testString.printSomething();
//Преобразовываем записанные в наш ByteArray данные в строку
String result = outputStream.toString();
//Возвращаем все как было
System.setOut(consoleStream);
//Меняем te на ??
StringBuilder stringBuilder = new StringBuilder(result);
StringBuffer stringBuffer = new StringBuffer(result);
for (int i = 0; i < stringBuffer.length() - 1; i++) {
if (stringBuilder.charAt(i) == 't' && stringBuilder.charAt(i + 1) == 'e') {
stringBuffer.replace(i, i + 1, "??");
}
}
result = stringBuffer.toString();
//Выводим строку в консоль
System.out.println(result);
}
public static class TestString {
public void printSomething() {
System.out.println("it's a text for testing");
}
}
}