Pegando partes de um texto no Java

(Last Updated On: 28 de dezembro de 2016)

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;
	}

}

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 carreira de certificação Java com 9 cursos preparatórios para a certificação da Oracle!

FIQUE POR DENTRO

Content Editor at Alura and Software Developer

  • Leonardo

    Parabéns pelo Post Alex,é muito bom e importante vermos essa tal facilidade com o substring() para nos poupar de alguma impressão gigantesca e consequentemente feia que ocorra.
    Eu particularmente não conhecia o método.

    • Obrigado Leonardo! Pois é, as vezes pensamos em fazer diversas implementações nossas para resolver um problema que a própria linguagem já resolve para nós!

      É sempre importante entendermos algumas classes e métodos que resolvem diversos problemas do nosso dia-a-dia. Além disso, para quem pretende tirar uma certificação, vale muito a pena se atentar aos detalhes. Fico contente que tenha gostado 🙂

      Abraços.

Próximo ArtigoQual o melhor arquivo de audio para meus vídeos?