Ajuda

Ola pessoal eu estou com um grande problema para resolver relacionado com grafos.

Eu preciso criar um programa em Java para modelar o grafo. A inserção inicial dos dados
deve ser feita através de um arquivo texto (.txt) que será carregado no início da execução do programa.

Eu já busquei na internet vários tutos mas nenhum que se aplique especificamente a este exemplo.

Isso me cheira a exercício de faculdade! :smiley: Então, não vou dar a solução mastigada ainda. Algumas dicas:

  • Use um FileReader, adequado para leitura de arquivos de texto;
  • Encapsule o FileReader em um BufferedReader para melhor performance e comodidade;
  • Veja a documentação da API do Java, na classe BufferedReader, e procure qual método é melhor para ler uma linha por vez;
  • Veja a documentação da API do Java, na classe String, e procure qual método é melhor para dividir uma string em partes sabendo qual é o caractere separador;
  • Armazene cada conjunto de valores em um array, e coloque estes arrays numa implementação de Collection que se adeque às suas necessidades;
  • Lembre-se de fechar os readers e streams que você abriu.

[]s
–mcbrain

[quote=mcbrain]Isso me cheira a exercício de faculdade! :smiley: Então, não vou dar a solução mastigada ainda. Algumas dicas:

  • Use um FileReader, adequado para leitura de arquivos de texto;
  • Encapsule o FileReader em um BufferedReader para melhor performance e comodidade;
  • Veja a documentação da API do Java, na classe BufferedReader, e procure qual método é melhor para ler uma linha por vez;
  • Veja a documentação da API do Java, na classe String, e procure qual método é melhor para dividir uma string em partes sabendo qual é o caractere separador;
  • Armazene cada conjunto de valores em um array, e coloque estes arrays numa implementação de Collection que se adeque às suas necessidades;
  • Lembre-se de fechar os readers e streams que você abriu.

[]s
–mcbrain

[/quote]

Brother me desculpe mas eu to numa enrascada todos os exemplos que pego na net pra testar sempre dão erros e o pior de tudo que sou iniciante em java, e sei muito pouca coisa mesmo!!!
Então se puder dar uma força eu seria muito grato!!

Para manipular arquivos: http://www.guj.com.br/article.show.logic?id=13
Para quebrar uma linha em uma array, dê uma estudada no método split da classe String.

Siga o tutorial do GUJ de manipulação de arquivos e posta suas duvidas.

Não adianta nada copiar o codigo da net e executar para ver se é o que você quer. A não ser que você queira ficar CTRL+C e CTRL+V sempre!

[quote=mcbrain]Isso me cheira a exercício de faculdade! :smiley: Então, não vou dar a solução mastigada ainda. Algumas dicas:

  • Use um FileReader, adequado para leitura de arquivos de texto;
  • Encapsule o FileReader em um BufferedReader para melhor performance e comodidade;
  • Veja a documentação da API do Java, na classe BufferedReader, e procure qual método é melhor para ler uma linha por vez;
  • Veja a documentação da API do Java, na classe String, e procure qual método é melhor para dividir uma string em partes sabendo qual é o caractere separador;
  • Armazene cada conjunto de valores em um array, e coloque estes arrays numa implementação de Collection que se adeque às suas necessidades;
  • Lembre-se de fechar os readers e streams que você abriu.

[]s
–mcbrain

[/quote]

Prezado desculpe minha ignorância em relação ao Java, mas a minha principal duvida esta em como guardar os dados de cada uma das colunas(linhas no caso) que serão separados com o split dentro de um vetor.

é mais ou menos isso que eu preciso fazer?


public static void lerarquivo(){
       String linha = null;
 
       try{
       File file = new File("C://Lista.txt");
       FileReader reader = new FileReader(file);
       BufferedReader leitor = new BufferedReader(reader);

       StringTokenizer st = null;
       
       while((linha = leitor.readLine())!= null){ //Acredito que isto sirva para ler o arquivo por linha
       st = new StringTokenizer(linha); 
       String [] array = st.nextToken(); //
             
       }
       reader.close();

       }catch (Exception e) {
   // TODO: handle exception
       }
}

Colega, não tem por que pedir desculpas, todo mundo tem que começar de algum lugar! Só não gosto de dar a solução de cara se posso ajudar alugém a aprender… :wink:

Você está no caminho certo. Segue aqui uma solução utilizando a interface List.

	try {
		//Cria um FileReader (adequado para ler arquivos de texto)
		FileReader fr = new FileReader(new File("C:\teste.txt"));
		//Encapsula o FileReader em um BufferedReader
		//para melhor performance
		BufferedReader br = new BufferedReader(fr);
		//String que armazena temporariamente o conteudo lido
		String s;
		//Lista com os arrays
		List<String[]> lista = new ArrayList<String[]>();
		
		//Le cada linha e explode a String em um array,
		//ja adicionando na lista
		while ((s = br.readLine())!= null) {
			lista.add(s.split(";"));
		}
		
		fr.close();
		br.close();
		
		//Itera nossa lista para mostrar o resultado
		int i = 0;
		for (String[] linha : lista) {
			System.out.println(++i +": " linha[0]+", "+linha[1]+", "+linha[2]);
		}
		
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}

Se você precisa usar apenas arrays, pode armarzenar cada linha (um array com dimensao = 3) em um outro array, por exemplo:

String[][] lista = new String[3][];

int linhas = 0;
while ((s = br.readLine())!= null) {
	lista[linhas++] = (s.split(";"));
}

Prezado mcbrain agora minha dúvida estão voltadas para como eu vou poder manipular a array lista.

Tipo inserir um elemento na lista ou remover um elemento da lista.

Acredito que para inserir a logica criar algo para varrer o vetor no casso array list e caso não encontre lista recebe o novo elemento em posição da lista que provavelmente seria a ultima.
Agora não me pergunte como fazer isso . rsrs

E para remover um elemento ou vários elementos
Acredito que primeiro verifica-se se o(s) elemento(s) fazem parte da lista caso lista.remove(“elemento”);
Seria mais ou menos isso?

Não entendi exatamente sua dúvida. Se é com relação aos métodos para manipular um ArrayList: http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html – nada melhor do que a especificação da API para aprender.

Como o ArrayList implementa a interface Iterable, você pode usar (como no exemplo) um “for avançado” para iterar os elementos:

for (String[] linha : lista) {
 //faz alguma coisa com o elemento
}

[]s
–mcbrain

Ajudou aki!!!

[quote=Designer]Bom na verdade esse problema será voltado para grafos( E o arquivo txt contem vertices e arestas)

Seria possivel salvar cada linha da lista em vetor e depois manipula-lo em outra classe?

Bragança, Guarda, 200

Bragança-cidade1(vertice 1)
Guarda-cidade2(vertice2)
200(peso da aresta)

Quando eu digo manipular quero dizer depois de carregar os dados se seria possivel eu remover um vertice(cidade1) ou vertice2(cidade2), ou aresta(peso da ligação entre um vertice e outro).[/quote]

Aparentemente você não entendeu o programa que coloquei de exemplo. O método split já retorna um array com os 3 valores de cada linha, um em cada elemento de um array. E a lista armazena todos estes arrays. Aí é só você navegar a lista (vide os metodos da API que linkei antes) e acessar os arrays através do índice, também como no exemplo que coloquei.

Digamos que você tenha um array:

String[] array = new String[]{"foo","bar","baz"};

Você pode acessar os valores da seguinte maneira, por exemplo:


array[0] = "zed" // troca o valor do 1o elemento para "zed"

array[2] = null; //remove a referencia do terceiro elemento do array ao valor antigo (efetivamente descartando a String "baz")

String foo = array[0]; //atribui o valor "zed" a variavel foo;
String bar = array[1]; //atribui o valor "foo" a variavel bar;
String baz = array[2]; //atribui o valor null a variavel baz;

System.out.println(foo); //escreve "zed" no stdout
System.out.println(bar); //escreve "bar" no stdout
System.out.println(baz); //escreve "null" no stdout, comportamento default do toString() para referencias nulas.

E assim por diante. Se você está com este nível de dificuldade, sugiro dar uma estudada nos conceitos fundamentais de java e de programação, porque não vai adiantar você querer começar do meio: http://java.sun.com/docs/books/tutorial/getStarted/index.html e http://java.sun.com/docs/books/tutorial/java/nutsandbolts/index.html

[]s
–mcbrain

O pessoal da caelum tem uma apostila muito boa http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/
Capitulo 15 poderá ser util… :wink:

esta tudo ok aki