[RESOLVIDO] Collection Set, dúvida

6 respostas
guj1

Olá pessoal,

Tenho um arquivo que contem todos os estados brasileiros, um em cada linha.
Eu li o arquivo, armazenei em um buffer, peguei cada linha e inclui numa collection enquanto houvesse linha.
depois eu varri a collection e na impressão não sai todos os estados, por quê?
Onde estou errando?

Código:

public class OrdenaTexto {

	/**
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {

		Collection<String> estados = new TreeSet<>(Collator.getInstance());
		File f = new File("c:/EstadosBrasil.txt");
		Reader entrada = new FileReader(f);
		BufferedReader b = new BufferedReader(entrada);

		for (int i = 0; i < f.length(); i++) {
			String estado = b.readLine();
			StringTokenizer st = new StringTokenizer(estado);
			estados.add(estado);
			if (b.readLine() == null) {
				break;
			}
		}

		for (String e : estados) {
			System.out.println(e);

		}

	}

}

6 Respostas

K

Conferiu a inserção de todos os Estados?
Lembre-se que a interface Set não permite objetos repetidos.

Porque essa linha: StringTokenizer st = new StringTokenizer(estado);

e tbem da pra dar uma melhorada nesse seu codigo.

String linha = "";

while(!(linha = b.readLine()).equals("")) {
estados.add(linha);
}
guj1

Conferir a inserção dos estados!
Não existe nenhum estado brasileiro com nome igual!
StringTokenizer st = new StringTokenizer(estado); Linha citada por engano, estava apenas fazendo testes.

Só para esclarecer melhor

Após cada inserção eu imprimi a lista e olha o que acontece:

[São Paulo]
[Maranhão, São Paulo]
[Maranhão, Pernambuco, São Paulo]
[Alagoas, Maranhão, Pernambuco, São Paulo]
[Alagoas, Maranhão, Mato Grosso, Pernambuco, São Paulo]
[Alagoas, Maranhão, Mato Grosso, Minas Gerais, Pernambuco, São Paulo]
[Alagoas, Maranhão, Mato Grosso, Minas Gerais, Pernambuco, Piauí, São Paulo]
[Alagoas, Maranhão, Mato Grosso, Minas Gerais, Pernambuco, Piauí, Rio Grande do Norte, São Paulo]
[Alagoas, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, São Paulo]
[Alagoas, Bahia, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, São Paulo]
[Alagoas, Bahia, Distrito Federal, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, São Paulo]
[Alagoas, Bahia, Distrito Federal, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, Rondonia, São Paulo]
[Alagoas, Bahia, Distrito Federal, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, Rondonia, Santa Catarina, São Paulo]
[Alagoas, Bahia, Distrito Federal, Maranhão, Mato Grosso, Minas Gerais, Paraíba, Pernambuco, Piauí, Rio Grande do Norte, Rondonia, Santa Catarina, São Paulo, Tocantins]

di.magdaleno

Você tentou ler o arquivo a partir do loop sugerido pelo kleberdamasco?

O método File.length() retorna o tamanho, em bytes, do arquivo e não o número de linhas. Então na verdade o seu loop for está iterando uma vez para cada byte do arquivo e a cada iteração lendo uma linha. A menos que seu arquivo tenha o mesmo tamanho em bytes que o número de linhas esse loop não vai ser eficaz.

A forma sugerida pelo kleberdamasco deve dar certo, mas eu faria assim:String linha = ""; while((linha = b.readLine()) != null){ estados.add(linha); }O método readLine() atribui o valor da linha do arquivo pra variavel String linha, se o arquivo acabar atribui null. Enquanto linha for diferente de null o laço prossegue.

K

di.magdaleno:
Você tentou ler o arquivo a partir do loop sugerido pelo kleberdamasco?

O método File.length() retorna o tamanho, em bytes, do arquivo e não o número de linhas. Então na verdade o seu loop for está iterando uma vez para cada byte do arquivo e a cada iteração lendo uma linha. A menos que seu arquivo tenha o mesmo tamanho em bytes que o número de linhas esse loop não vai ser eficaz.

A forma sugerida pelo kleberdamasco deve dar certo, mas eu faria assim:String linha = ""; while((linha = b.readLine()) != null){ estados.add(linha); }O método readLine() atribui o valor da linha do arquivo pra variavel String linha, se o arquivo acabar atribui null. Enquanto linha for diferente de null o laço prossegue.

tem q ser diferente de null mesmo, já q ele retorna null no final e não vazio.

guj1

Vocês são demais!
Deu certo, agora ele está imprimindo todos os estados.
Grande abraço!!

di.magdaleno

guj1:
Vocês são demais!
Deu certo, agora ele está imprimindo todos os estados.
Grande abraço!!

Que ótimo!

Se não tiver mais nenhuma dúvida sobre esse tópico, seria interessante marcá-lo como resolvido no assunto para quem estiver com o mesmo problema já saber logo de cara que foi resolvido.

Abraços…

Criado 20 de abril de 2013
Ultima resposta 21 de abr. de 2013
Respostas 6
Participantes 3