Gostaria de saber, neste caso, se o código que eu fiz, por mais simples que esteja, condiz com o desafio "Extraindo hashtags de um texto". Diferente do código do instrutor, eu fiz com que ele simplesmente iterasse sobre a minha String
e, caso encontrasse alguma hashtag, ele a exibisse; caso contrário, não faria nada.
Meu codigo ficou assim:
package com.github.rickmvi.challenge15;
import com.github.rickmvi.jtoolbox.console.Out;
import com.github.rickmvi.jtoolbox.console.utils.ScannerUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Hashtagstarget {
public static void main(String[] args) {
ScannerUtils.init();
final Pattern PATTERN = Pattern.compile("#[a-zA-Z]+"); // exemplo 1
final Pattern PATTERN2 = Pattern.compile("#\\w+"); // exemplo 2
Out.print("Enter a react: ");
String react = ScannerUtils.nextLine();
Matcher matcher = PATTERN2.matcher(react);
for (int i = 0; i < react.length(); i++) {
if (matcher.find())
Out.printFormatted(
"The react [{}] is a hashtag%n",
react.substring(
matcher.start(),
matcher.end())
);
}
ScannerUtils.close();
}
}
Eu também cheguei a fazer uma pequena refatoração no código do instrutor.
package com.github.rickmvi.challenge15;
import com.github.rickmvi.jtoolbox.console.Out;
import com.github.rickmvi.jtoolbox.console.utils.ScannerUtils;
import com.github.rickmvi.jtoolbox.control.While;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtraindoHashtags {
public static void main(String[] args) {
ScannerUtils.init();
System.out.print("Digite o texto: ");
String texto = ScannerUtils.nextLine();
Pattern pattern = Pattern.compile("#\\w+");
Matcher matcher = pattern.matcher(texto);
ArrayList<String> hashtags = new ArrayList<>();
While.whileTrue(matcher::find, () -> hashtags.add(matcher.group()));
ScannerUtils.close();
Out.printLine(hashtags.isEmpty() ?
"Nenhuma hashtag encontrada." :
"Hashtags encontradas: " + String.join(", ", hashtags)
);
}
}
O que meu método whiletrue
faz:
@lombok.experimental.UtilityClass
public class While {
/**
* Repeatedly executes the action while the condition returns true.
*
* @param condition the condition to evaluate before each iteration
* @param action the action to execute
*/
public static void whileTrue(@NotNull BooleanSupplier condition, Runnable action) {
while (condition.getAsBoolean()) action.run();
}
A parte do Scanner
, eu transformei em uma classe utilitária para evitar ter que instanciá-la manualmente sempre. Então, em todo projeto que faço, apenas a chamo.
O método printFormatted
foi feito usando regex; ele substitui alguns placeholders definidos por objetos, como o printf
faz.