Pegando partes de um texto no Java

Pegando partes de um texto no Java

Estou me preparando para a certificação da Oracle e tive que lidar com a seguinte situação:

Como pegar uma parte de uma String? Vamos verificar a classe Livro:


public class Livro {

private final String nome; 
private final String autor;
private final String descricao;

public Livro(String nome, String autor, String descricao) { 
this.nome = nome; 
this.autor = autor;
this.descricao = descricao; 
}

public String getNome() { return nome; }

public String getAutor() { return autor; }

public String getDescricao() { return descricao; }

}
Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Adicionando um livro novo:


String nome = "Java EE"; 
String autor = "Alberto Souza"; 
String descricao = "A especificação Java EE e suas respectivas " + "implementações vêm evoluindo ao longo do tempo. " + "A configuração e utilização das especificações " + "ficaram bem mais fáceis. O que ainda não é " + "tão fácil de enxergar é como podemos colocá-las " + "para trabalhar em conjunto. Quais eu devo usar " + "no meu próximo projeto? O que realmente eu posso " + "fazer com cada uma delas? Como fazer com que uma " + "converse com a outra?";

Livro livro = new Livro(nome, autor, descricao);

E essa descrição gigantesca? Vamos imprimir o livro e ver o que acontece:

nome: Java EE autor: Alberto Souza descricao: A especificação Java EE e suas respectivas implementações vêm evoluindo ao longo do tempo.

A configuração e utilização das especificações ficaram bem mais fáceis. O que ainda não é tão fácil de enxergar é como podemos colocá-las para trabalhar em conjunto.

Quais eu devo usar no meu próximo projeto? O que realmente eu posso fazer com cada uma delas? Como fazer com que uma converse com a outra?

Se apenas um livro já está ocupando todo esse espaço imagina uma lista com vários! Não vai ser nada legal... Que tal, no momento da impressão, pegarmos apenas os 30 primeiros caracteres? Podemos fazer isso utilizando o método substring() da classe String. Então vamos sobrescrever o método toString() da classe Livro:


@Override 
public String toString() { 
    if (descricao.length() > 30) {
return "nome: " + nome + "\\nautor: " + autor + "\\ndescricao: " + descricao.substring(0, 30) + "..."; }

return "nome: " + nome + "\\nautor: " + autor + "\\ndescricao: " + descricao; }

Imprimindo novamente o livro:

 nome: Java EE autor: Alberto Souza descricao: A especificação Java EE e suas...

Muito bom! Mas o que significa os parâmetros 0 e 30? O método substring() tem a seguinte assinatura: substring(int beginIndex, int endIndex). O índice inicial começa no 0, por isso coloquei o 0 como primeiro parâmetro, mas e o segundo parâmetro? Vai até a casa 30? Vejamos:

cap-string

Como podemos ver o índice final não é incluso! Esse é um dos cuidados que precisamos tomar... Além do índice inicial e final, o método substring() também recebe apenas o índice inicial:


return "nome: " + nome + "\\nautor: " + autor + "\\ndescricao: " + descricao.substring(30);

Imprimindo o livro novamente:

nome: Java EE autor: Alberto Souza 

descricao: respectivas implementações vêm evoluindo ao longo do tempo. A configuração e utilização das especificações ficaram bem mais fáceis. O que ainda não é tão fácil de enxergar é como podemos colocá-las para trabalhar em conjunto. Quais eu devo usar no meu próximo projeto? O que realmente eu posso fazer com cada uma delas? Como fazer com que uma converse com a outra?...

Ué, o que aconteceu??? Como podemos ver está faltando uma parte da descrição, ou seja, quando utilizamos o substring() com apenas um parâmetro, informamos que queremos que ele pegue o pedaço da String a partir do índice informado, ou seja, a partir do índice 30 até o final.

Legal, vimos que o substring() tem a capacidade de pegar um pedaço da String de acordo com o índice, mas por que eu devo sempre começar por 0? Vamos supor que precisamos fazer uma paginação pegando os 30 próximos caracteres de um texto e que agora o índice inicial comece pelo 1 e o índice final é incluso:


String page1 = texto.substring(1, 30); ...

Aparentemente melhorou, mas vamos verificar a segunda página:


String page2 = texto.substring(31, 60); ...

E aí? Ele vai pegar 30 ou 29 caracteres? Agora vamos verificar com o padrão atual:


String page1 = texto.substring(0, 30); 
String page2 = texto.substring(30, 60);

Veja que é bem mais natural entender que serão devolvidos os próximos 30 caracteres em cada uma das páginas. Devido a essa situação o padrão de iniciar pelo 0 e não incluir o último índice foi adotado!

Gostou do substring()? Quer aprender mais detalhes da linguagem Java e se preparar para a certificação da Oracle? Pensando nisso, o instrutor Guilherme Silveira criou a formação de certificação Java com 9 cursos preparatórios para a certificação da Oracle!

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Programação