Arquivos e Indices - Estrutura de Dados

Pessoal é o seguinte:

Eu estou tento que gerar alguns arquivos aqui e preciso tambem gerar um arquivo de indice pra ele:

Exemplo: eu preciso gravar “Clientes” no arquivo, so que tenho que organizar o indice com base nos codigos do cliente.
ai quando fosse fazer a pesquisa usaria os indices pra procurar no arquivo principal…

eu sei manipular arquivos etc… porém nao tenho idéia de como fazer essa associação do arquivo indice com o arquivos dos clientes…

alguem pode me ajudar?

grato Naum Jefferson

Não seria melhor usar um banco de dados SQL de verdade? Até vem um junto com o JDK (que é o JavaDB).

Olá Jefferson…
Passei dias pesquisando sobre esse assunto e não obtive sucesso.
Desisti da idéia e resolvi mexer com Arquivos texto ou até banco de dados.
Veja oque vc acha da idéia de tentar usar o Apache Lucene
http://lucene.apache.org

Até mais

Isso é um trabalho de Estrutura de Dados…

o professor nao quer que use Banco de Dados…, tem que ser na mão…

alguem tem alguam idéia? grato

[quote=eliangela]Olá Jefferson…
Passei dias pesquisando sobre esse assunto e não obtive sucesso.
Desisti da idéia e resolvi mexer com Arquivos texto ou até banco de dados.
Veja oque vc acha da idéia de tentar usar o Apache Lucene
http://lucene.apache.org

Até mais[/quote]

Eu tinha visto seu topico… porém não dá pra usar…
porque o professor quer que implemente!!!

Ou seja, dê uma olhada nos seus livros, e veja que algoritmos estão disponíveis. Acho que não é nada que você tenha de “tirar” de sua cabeça.

Bom, a idéia de indice é você encontrar com maior rapidez um registro a partir de alguma informação.

Por exemplo, um arquivo de clientes:

1;João; Rua A
2;Jose; Rua X
3;Maria; Rua 12
...

Se você quiser encontrar Maria mais rápido, vá direto na linha 3, ao invés de percorrer um a um. Pensando assim, implemente o algoritmo.

Sei lá, como o colega acima disse, você pode usar algoritmos de busca propostos pelo teu professor. Ou usar as estrutas do java mesmo (HashMap, TreeMap, etc), que implementam alguns tipos de algoritmos de busca.

[quote=pozzo]Bom, a idéia de indice é você encontrar com maior rapidez um registro a partir de alguma informação.

Por exemplo, um arquivo de clientes:

1;João; Rua A
2;Jose; Rua X
3;Maria; Rua 12
...

Se você quiser encontrar Maria mais rápido, vá direto na linha 3, ao invés de percorrer um a um. Pensando assim, implemente o algoritmo.

Sei lá, como o colega acima disse, você pode usar algoritmos de busca propostos pelo teu professor. Ou usar as estrutas do java mesmo (HashMap, TreeMap, etc), que implementam alguns tipos de algoritmos de busca.[/quote]

Cara, Vlw pela luz…

vou tentar por aqui!!!

grato, Naum Jefferson

Vamos por partes, como diria nosso amigo Jack.

Para persistir um objeto em um arquivo, o objeto deve implementar a interface Serializable.

Segue abaixo o código da classe Cliente que vou usar no exemplo:


import java.io.Serializable;


public class Cliente implements Serializable{

	private static final long serialVersionUID = 1L;
	String indice;
	String nome;
	String maisUmDado;
	
	Cliente () {
		
	}
	
	Cliente(String indice, String nome, String maisUmDado) {
		this.indice = indice;
		this.nome = nome;
		this.maisUmDado = maisUmDado;
	}
	
	public String getIndice() {
		return indice;
	}
	public void setIndice(String indice) {
		this.indice = indice;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getMaisUmDado() {
		return maisUmDado;
	}
	public void setMaisUmDado(String maisUmDado) {
		this.maisUmDado = maisUmDado;
	}
}

Abaixo segue o código comentado explicando como você vai persistir e recuperar o objeto:


import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public class EDIndice {

	public static void main(String[] args) {
		// Ok, aqui vamos criar três instâncias de cliente
		
		Cliente c1 = new Cliente("1", "Cliente1", "Dado1");
		Cliente c2 = new Cliente("2", "Cliente2", "Dado2");
		Cliente c3 = new Cliente("3", "Cliente3", "Dado3");
		
		/* 
		 *  Abaixo segue o código que mostra como você pode persistir tais
		 *  objetos direto para um arquivo.
		*/
		
		ObjectOutputStream out;
		try {
			out = new ObjectOutputStream(new FileOutputStream("dados.dat"));
			out.writeObject(c1);
			out.writeObject(c2);
			out.writeObject(c3);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// Simples né?
		
		/*
		 * Agora o código que mostra como ler tais objetos do arquivo
		 */
		
		ObjectInputStream in;
		try {
			in = new ObjectInputStream(new FileInputStream("dados.dat"));
			Cliente cliente = (Cliente) in.readObject();
			System.out.println(cliente.getNome());
			while (cliente != null) {
				cliente = (Cliente) in.readObject();
				System.out.println(cliente.getNome());
			}
			in.close();
		} catch (EOFException eof) {
			/*
			 * Essa exception é disparada toda vez que o fim
			 * do arquivo é alcançado, não recomendo colocar
			 * printStackTrace aqui.
			 */
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

O arquivo de índice você pode criar da mesma forma que criamos o arquivo acima.

Se você quiser por exemplo um arquivo de índice que tenha a ordem alfabética dos clientes, ele precisa conter apenas os índices do cliente. Com esse índice, basta você percorrer o arquivo com os dados de forma mais ágil, sabendo onde estão os clientes que você quer buscar.

Tente a partir do que já te forneci terminar o exercício. Se não conseguir concluir, poste as dúvidas aqui que te ajudo a continuar.

Um abraço, boa sorte!

Bom… fiquei curioso e acabei terminando o código.

Dei uma pequena melhorada no original e incluí um exemplo de arquivo de índices.

Se quiser praticar, não cole. Tente você mesmo.

Quando cansar (ou não), lá vai a solução completa:


import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;


public class EDIndice {

	public static void main(String[] args) {
		// Ok, aqui vamos criar três instâncias de cliente
		
		Cliente c1 = new Cliente("1", "Cliente1", "Dado1");
		Cliente c2 = new Cliente("2", "Cliente2", "Dado2");
		Cliente c3 = new Cliente("3", "Cliente3", "Dado3");
		
		/* 
		 *  Abaixo segue o código que mostra como você pode persistir tais
		 *  objetos direto para um arquivo.
		*/
		
		ObjectOutputStream out;
		try {
			out = new ObjectOutputStream(new FileOutputStream("dados.dat"));
			out.writeObject(c1);
			out.writeObject(c2);
			out.writeObject(c3);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// Simples né?
		
		/*
		 * 
		 * Cria arquivo com índices, supondo que você queira
		 * os índices na ordem 2, 1 e 3.
		 * 
		 */
		
		ObjectOutputStream indicesOut;
		try {
			indicesOut = new ObjectOutputStream(new FileOutputStream("indices.dat"));
			indicesOut.writeObject(new String("2"));
			indicesOut.writeObject(new String("1"));
			indicesOut.writeObject(new String("3"));
			indicesOut.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		/*
		 * Agora o código que mostra como ler tais objetos do arquivo
		 */
		
		HashMap<String, Cliente> clientes = new HashMap<String, Cliente>();
		
		ObjectInputStream in;
		try {
			in = new ObjectInputStream(new FileInputStream("dados.dat"));
			Cliente cliente;
			do {
				cliente = (Cliente) in.readObject();
				if (cliente != null) {
					clientes.put(cliente.getIndice(), cliente);
				}
			}	while (cliente != null); 
			
			in.close();
		} catch (EOFException eof) {
			/*
			 * Essa exception é disparada toda vez que o fim
			 * do arquivo é alcançado, não recomendo colocar
			 * printStackTrace aqui.
			 */
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		/*
		 * O código que lê o arquivo de índices 
		 */
		
		ArrayList<String> indices = new ArrayList<String>();
		
		ObjectInputStream indicesIn;
		try {
			indicesIn = new ObjectInputStream(new FileInputStream("indices.dat"));
			String indice;
			do {
				indice = (String) indicesIn.readObject();
				if (indice != null) {
					indices.add(indice);
				}
			}	while (indice != null); 
			
			indicesIn.close();
		} catch (EOFException eof) {
			/*
			 * Essa exception é disparada toda vez que o fim
			 * do arquivo é alcançado, não recomendo colocar
			 * printStackTrace aqui.
			 */
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		/*
		 * E, finalmente, a parte final do código, que exibe os objetos
		 * na ordem definida no arquivo de índices
		 */
		
		for (String indice: indices) {
			System.out.println(clientes.get(indice).getNome());
		}
	}
}

[quote=pablosaraiva]Bom… fiquei curioso e acabei terminando o código.

Dei uma pequena melhorada no original e incluí um exemplo de arquivo de índices.

Se quiser praticar, não cole. Tente você mesmo.

Quando cansar (ou não), lá vai a solução completa:

[code]

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

public class EDIndice {

public static void main(String[] args) {
	// Ok, aqui vamos criar três instâncias de cliente
	
	Cliente c1 = new Cliente("1", "Cliente1", "Dado1");
	Cliente c2 = new Cliente("2", "Cliente2", "Dado2");
	Cliente c3 = new Cliente("3", "Cliente3", "Dado3");
	
	/* 
	 *  Abaixo segue o código que mostra como você pode persistir tais
	 *  objetos direto para um arquivo.
	*/
	
	ObjectOutputStream out;
	try {
		out = new ObjectOutputStream(new FileOutputStream("dados.dat"));
		out.writeObject(c1);
		out.writeObject(c2);
		out.writeObject(c3);
		out.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	// Simples né?
	
	/*
	 * 
	 * Cria arquivo com índices, supondo que você queira
	 * os índices na ordem 2, 1 e 3.
	 * 
	 */
	
	ObjectOutputStream indicesOut;
	try {
		indicesOut = new ObjectOutputStream(new FileOutputStream("indices.dat"));
		indicesOut.writeObject(new String("2"));
		indicesOut.writeObject(new String("1"));
		indicesOut.writeObject(new String("3"));
		indicesOut.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	/*
	 * Agora o código que mostra como ler tais objetos do arquivo
	 */
	
	HashMap<String, Cliente> clientes = new HashMap<String, Cliente>();
	
	ObjectInputStream in;
	try {
		in = new ObjectInputStream(new FileInputStream("dados.dat"));
		Cliente cliente;
		do {
			cliente = (Cliente) in.readObject();
			if (cliente != null) {
				clientes.put(cliente.getIndice(), cliente);
			}
		}	while (cliente != null); 
		
		in.close();
	} catch (EOFException eof) {
		/*
		 * Essa exception é disparada toda vez que o fim
		 * do arquivo é alcançado, não recomendo colocar
		 * printStackTrace aqui.
		 */
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	/*
	 * O código que lê o arquivo de índices 
	 */
	
	ArrayList<String> indices = new ArrayList<String>();
	
	ObjectInputStream indicesIn;
	try {
		indicesIn = new ObjectInputStream(new FileInputStream("indices.dat"));
		String indice;
		do {
			indice = (String) indicesIn.readObject();
			if (indice != null) {
				indices.add(indice);
			}
		}	while (indice != null); 
		
		indicesIn.close();
	} catch (EOFException eof) {
		/*
		 * Essa exception é disparada toda vez que o fim
		 * do arquivo é alcançado, não recomendo colocar
		 * printStackTrace aqui.
		 */
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	/*
	 * E, finalmente, a parte final do código, que exibe os objetos
	 * na ordem definida no arquivo de índices
	 */
	
	for (String indice: indices) {
		System.out.println(clientes.get(indice).getNome());
	}
}

}

[/code][/quote]

Cara vlw mesmo, deu pra se basear muito pelo que vc passou…
mas até ai ta ok…
a idéia do indice ta ok, mas se tivesse por exemplo muitos registros gravados no arquivo…
seria inviável… eu ler todo o arquivo e jogar na memoria… pra poder pega o que eu quero!!!
o indice num serve justo pra isso? eu nao teria que colocar a posição no arquivo de indice… e quando fosse ler o arquivo principal dos dados ir direito na posição que ele se encontra e pegar o objeto sem ter que ler os outros dados?
tem como fazer isso?
grato mais uma vez…

Naum Jefferson

Quase isso…

Acontece que um objeto tipo esse “Cliente” ocupa muito pouco espaço na memória. Você pode ter centenas deles tranquilamente.

Caso você tenha milhares de clientes e não queira coloca-los na memória (por não caber ou por não ser eficiente), você pode implementar um filtro na leitura do arquivo de dados.

Por exemplo, buscar todos os clientes com nome João.

Você lê um a um e só joga no HashMap os que tem nome João. Mais ou menos o que faz um “select” do SQL.

Agora, o arquivo de índices não é feito pra filtrar dados. É feito, geralmente, para ordenar. Então caso você tenho 10 mil registros na tabela, todos eles estarão listados no seu arquivo de índices.

[quote=pablosaraiva]Quase isso…

Acontece que um objeto tipo esse “Cliente” ocupa muito pouco espaço na memória. Você pode ter centenas deles tranquilamente.

Caso você tenha milhares de clientes e não queira coloca-los na memória (por não caber ou por não ser eficiente), você pode implementar um filtro na leitura do arquivo de dados.

Por exemplo, buscar todos os clientes com nome João.

Você lê um a um e só joga no HashMap os que tem nome João. Mais ou menos o que faz um “select” do SQL.

Agora, o arquivo de índices não é feito pra filtrar dados. É feito, geralmente, para ordenar. Então caso você tenho 10 mil registros na tabela, todos eles estarão listados no seu arquivo de índices.[/quote]

Entendido. :stuck_out_tongue:

:arrow: Obrigado mais uma vez…

vou seguir seus conselhos e terminar logo esse trabalho…

Abraço, Naum Jefferson

[quote=pablosaraiva]Vamos por partes, como diria nosso amigo Jack.

Para persistir um objeto em um arquivo, o objeto deve implementar a interface Serializable.

Segue abaixo o código da classe Cliente que vou usar no exemplo:


import java.io.Serializable;


public class Cliente implements Serializable{

	private static final long serialVersionUID = 1L;
	String indice;
	String nome;
	String maisUmDado;
	
	Cliente () {
		
	}
	
	Cliente(String indice, String nome, String maisUmDado) {
		this.indice = indice;
		this.nome = nome;
		this.maisUmDado = maisUmDado;
	}
	
	public String getIndice() {
		return indice;
	}
	public void setIndice(String indice) {
		this.indice = indice;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getMaisUmDado() {
		return maisUmDado;
	}
	public void setMaisUmDado(String maisUmDado) {
		this.maisUmDado = maisUmDado;
	}
}

Abaixo segue o código comentado explicando como você vai persistir e recuperar o objeto:


import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public class EDIndice {

	public static void main(String[] args) {
		// Ok, aqui vamos criar três instâncias de cliente
		
		Cliente c1 = new Cliente("1", "Cliente1", "Dado1");
		Cliente c2 = new Cliente("2", "Cliente2", "Dado2");
		Cliente c3 = new Cliente("3", "Cliente3", "Dado3");
		
		/* 
		 *  Abaixo segue o código que mostra como você pode persistir tais
		 *  objetos direto para um arquivo.
		*/
		
		ObjectOutputStream out;
		try {
			out = new ObjectOutputStream(new FileOutputStream("dados.dat"));
			out.writeObject(c1);
			out.writeObject(c2);
			out.writeObject(c3);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// Simples né?
		
		/*
		 * Agora o código que mostra como ler tais objetos do arquivo
		 */
		
		ObjectInputStream in;
		try {
			in = new ObjectInputStream(new FileInputStream("dados.dat"));
			Cliente cliente = (Cliente) in.readObject();
			System.out.println(cliente.getNome());
			while (cliente != null) {
				cliente = (Cliente) in.readObject();
				System.out.println(cliente.getNome());
			}
			in.close();
		} catch (EOFException eof) {
			/*
			 * Essa exception é disparada toda vez que o fim
			 * do arquivo é alcançado, não recomendo colocar
			 * printStackTrace aqui.
			 */
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

O arquivo de índice você pode criar da mesma forma que criamos o arquivo acima.

Se você quiser por exemplo um arquivo de índice que tenha a ordem alfabética dos clientes, ele precisa conter apenas os índices do cliente. Com esse índice, basta você percorrer o arquivo com os dados de forma mais ágil, sabendo onde estão os clientes que você quer buscar.

Tente a partir do que já te forneci terminar o exercício. Se não conseguir concluir, poste as dúvidas aqui que te ajudo a continuar.

Um abraço, boa sorte!

[/quote]

Desculpe reviver o tópico!

Estou fazendo algo parecido com isso e não entendi muito bem como você cria os
índices.
No meu caso tenho um arquivo parecido com isso:

ISBN|Titulo|Autor1|Autor2|Autor3|Ano#9788588833043|Design e avaliação de
interfaces humano-computador|Rocha, Heloisa Vieira da|Baranauskas, Maria
Cecilia Calani||22003#0470723378|Research methods in human-computer
interaction|Lazar, Jonathan|Feng, Jinjuan Heidi|Hochheiser, Harry|2010#
3642237673

e tenho que criar um indice usando os # e | para achar as informações

Estou fazendo um trabalho nesse mesmo estilo só que preciso do byteoffset dos registros para colocar no índice primário mas não sei como recupera-los, pode me ajudar?