O método split

queria dividir um texto por linhas e quarda-las em array, não posso usar o StringTokenizer, falaram-me desse método split , porém não sei implementa-lo, quem souber e puder me ajudar, agradeço desde jah!!!

2 curtidas

O método split quebra uma String em várias substrings a partir de um caracter definido por você. Por exemplo, a String nome;teste;10, se você escolher como caracter o “;” ele quebrará a string em nome teste 10, ou seja, um vetor de três posições.

Para usar o método split faça o seguinte:

String frase = "nome;teste;10";
String array[] = new String[3];

array = frase.split(";");

Espero ter ajudado

3 curtidas

e quando a frase só tem um dado, por ex:
Nome;cpf;telefone;idade

teste;;;;

como faço pra ter esses dados. pq se “;;” = a nada, entao, Nome=teste;cpf= ; telefone= ; idade= ;

O split funciona da seguinte maneira. Você passa para ele um texto e um separador, e ele retorna para você um array, com o texto desse separador dividido em cada posição.

Por exemplo:

[code]string texto = “banana,maçã,laranja”;

string frutas[] = texto.split(",");
System.out.println(frutas[0]); //imprime banana
System.out.println(frutas[1]); //imprime maçã
System.out.println(frutas[2]); //imprime laranja[/code]

Se você tem o seu texto na memória, basta fazer:

string linhas[] = texto.split("\n");

E ele vai dividir o texto em todo lugar que houver uma quebra de linha “\n”, separando cada linha num array.

Caso você não tenha o texto na memória, e vá lê-lo de um arquivo, use a classe Scanner no lugar do split:

[code]Scanner leitor = new Scanner(new File(“seuArquivo.txt”));
List linhas = new ArrayList<>();
while (leitor.hasNextLine()) {
linhas.add(leitor.nextLine());
}
leitor.close();

String[] vetorDeLinhas = linhas.toArray();
[/code]

PS: A rigor o split trabalhar com expressões regulares. Assim, os separadores podem ser super sofisticados.

4 curtidas

Engraçado este comportamento do split… Eu poderia jurar que ele retornaria uma String vazia, mas ele ignora o valor…

Este é um problema fácil de resolver… Se você tiver um objeto e for preencher os dados com os valores desta String, basta garantir que os dados não inicializem com null, e sim com uma String vazia. Assim se você pode ignorar os dados que não forem retornados pelo split. O mesmo acontece com um StringTokenizer…

Masssss como sempre nosso amigo google tem a solução! :smiley:

Basta chamar split(";", -1). Para mais detalhes dê uma olhada:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#split(java.lang.String,%20int)

EDIT: Como alguém respondeu enquanto eu digitava, para o texto não ficar muito solto esta mensagem foi para a dúvida de liz.

Oi Bruno, valeu pela dica. Funcionou direitinho! Abs

Muito esclarecedor o exemplo do ViniGodoy.

Eu usei o split dentro de um método, para resolver um exercício da seguinte forma:

public void inverteString(String s){
String [] st1 = s.split(" ");
		[b]for[/b]([b]int[/b] i = st1.length-1; i>=0; i--)
		System.out.print(st1[i] + " ");
}

Neste caso, imprimo uma frase invertendo as posições das palavras.

e ai galera e quando a dividir um String sem nenhum separador
tipo preciso dividir os caractres um a um da pra fazer usando o split???

[quote=machitte]e ai galera e quando a dividir um String sem nenhum separador
tipo preciso dividir os caractres um a um da pra fazer usando o split???[/quote]

Para isso existe o método chatAt(). Retorna o caracter da posição indicada.
Outra opção é usar o método getBytes(), que retorna um array de caracteres.

[code]String texto = “Mico Maneco é levado”;

for (int i = 0; i < texto.length; i++) {
System.out.println(texto.charAt(i));
}[/code]

Pessoal, acredito que a minha duvida esteja envolvida com as questões comentadas acima.

O código abaixo foi feito para criar um arquivo texto e armazenar informações separadas o ponto e virgula.
Ex:
1;Letticia;RuaX;02216115980;08\11\1990;4545;1234;0.0;29\9\2014
2;Laura;RuaY;05215411223;21\10\1993;2121;1234;0.0;29\9\2014

Meu problema está em criar um código para seguinte solução:
A sexta e sétima posição equivalem a login e senha, quando a pessoa digitar essas informações tenho que percorrer o arquivo texto e verificar existe essas informações para que seja feito o logon.

public class Arquivo {

static void Armazena(ArrayList<Conta> cl) {
    try {
        File texto = new File("C:/texto.txt");
        FileWriter escrita = new FileWriter(texto);
        BufferedWriter escritor = new BufferedWriter(escrita);

        for (int i = 0; i < cl.size(); i++) {
            escritor.write(cl.get(i).toString());
            escritor.newLine();
        }
        escritor.flush();
        escritor.close();
        escrita.close();

    } catch (Exception e) {
        System.out.println("Erro ao criar arquivo!!");

    }
}

}

Galera o Linz perguntou e ninguém respondeu e eu tenho o mesmo problema aqui em uma aplicação, o negocio é o seguinte

eu tenho um arquivo csv tem o delimitador por ; sendo que o final de cada linha termina sem o delimitador até ai tudo bem facil de resolver e já foi resolvido
porém tenho outro problema que é o fato de as vezes o arquivo não conter informação entre os ;; ou seja as vezes fica ;;“valor”;;"outroValor;; e ai que acontece o problema
o meu scanner perde a posição por que ele ignora a primeira posição já indo direto para “valor” e ignora a terceira posição indo direto para "outroValor já pesquisei na internet
mas não encontrei a solução para esse problema que deve ser apenas um mero detalhe se alguém com mais experiencia por favor poder ajudar ficaria muito grato só falta isso para
eu terminar o meu pequeno projeto.

vou postar as partes do codigo que interessa

estou usando o seguinte delimitador

scanner.useDelimiter("([\n;]|(\r\n))+");

sendo que este esta correto pulando a linha quando encontra o final dela e separando por ;

o problema é que debugando coluna por coluna, ou seja posição por posição, percebo que ele perde a ordem quando encontra ;; gostaria de saber como resolver isso.

[color=red]spondendo ao samucation :[/color]

Tive o mesmo problema trabalhando na leitura de EFD(Speds) e tratei fazendo um replace na linha recebida trocando o delimitador(no meu caso o “|” e no teu caso “;”) por delimitador + " ". Com este espaço ele não entende que o caracter é duplicado e faz com que você capture as posições sempre iguais. Acredito que a lógica funcione para o Scanner.
Abaixo o exemplo melhor explicado.

	public static void main(String[] args) {
		/*Criamos a linha incluindo campos sem nenhum parametro
		 * Contamos que nesta string formaremos array de 6 posições, sendo o campo 4 igual " "(Entre os textos Programador e Java)
		 * Para que ele aceite no término daremos replace substituindo o delimitador por ele + " ", assim o método entenderá que há um campo onde estiver vazio
		 * No término passaremos o replaceFirst para retirar apenas o espaço que colocamos no replace anterior 
		 */
		String sLinha = "Fabio;Thielen;Programador;;Java;Write once, run anywhere".replace(";", "; ");
		String[] aCampos = sLinha.split(";");
		for(int i = 0;i < aCampos.length;i++){
			System.out.println("Campo "+i+": "+aCampos[i].replaceFirst(" ", ""));
		}
	}

}

Senhores, segue aqui a minha resolução, para a pergunta do caro amigo.

//Instanciando a Classe Scanner para variável sc
Scanner sc = new Scanner(System.in);
//Mensagem para o usuário entrar com o CEP
System.out.println(“Digite o CEP: “);
//Atribuição da variável, que vai receber a entrada do usuário
String cep = sc.next();
//Usando o método matches, para validar o CEP
//Formatação de 8 dígitos, para entrada de CEP
//A mesma deve ser colocada, de acordo com o tipo de dado
//Ex: RG = 9 CPF = 11
//Ex: CPF – cpf.mactches(”\d{11}”)
if (cep.matches("\d{8}")) {
//Atribuindo a variável a uma substring
//Que vai do índice 0(zero) ao índice 5(cinco)
String a = cep.substring(0, 5);
//Atribuindo a variável b uma substring
//Que vai do índice 5(cinco) ao índice 8(oito)
String b = cep.substring(5, 8);
//Criando uma variável(cep2) do tipo String
//Atribuindo variável cep2 a variável (a)
//Com o método concat, + a varável b
String cep2 = a.concat("-" + b);
//Saida na tela do resultado da variável cep2
System.out.println(cep2);
//System.out.println(a + “-” + b);

        //Criando um algoritmo para validação do CEP
        if (cep2.matches("\\d{5}-\\d{3}")) {
            System.out.println("Válido");
        } else {
            System.out.println("Inválido");

        }