Galera!
Como eu faço para o meu programa pegue um arquivo .txt, leia-o por completo palavra por palavra.
Eu uso o JFileChooser para pegar o arquivo e o BufferedReader para lê-lo (eu acho que é isso).
Mas eu queria que ele pegasse palavra por palavra e armazenasse numa árvore binária de busca. E caso haja palavra repetida ele apenas aumenta o contador de palavas, ou seja, não é armazenado novamente na árvore.
Tenho dois JButtons pra isso, vejam:
O primeiro para achar o arquivo no S.O.
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
String caminhoArquivo = "";
JFileChooser arquivo = new JFileChooser();
int retorno = arquivo.showOpenDialog(null);
if(retorno == JFileChooser.APPROVE_OPTION){
caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();
jLabel2.setText(caminhoArquivo);
} else{
JOptionPane.showMessageDialog(null, "Operação cancelada pelo usuário");
}
}
O segundo para lê-lo
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
if (jRadioButton1.isSelected()) {
try {
File arquivo = new File(jLabel1.getText());
FileReader fileReader = new FileReader(arquivo);
BufferedReader buffer = new BufferedReader(fileReader);
ArrayList<String> ar = new ArrayList<String>();
String line = buffer.readLine();
while (line != null) {
System.out.println(line);
line = buffer.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Como está a sua árvore binária, onde fica esse contador que você quer incrementar?
Bem, a árvore seria essa.
class No
{
public No esq;
public No dir;
public int chave;
public No()
{
esq = dir = null;
}
public No(int chave, No esq, No dir)
{
this.chave = chave;
this.esq = esq;
this.dir = dir;
}
}
//CLASSE ARVORE
class Arvore
{
private No ptr; // ponteiro que ira "andar" na árvore!
private No no; // variável para armazenar o nó atual
private boolean logEsq = true;
private boolean logDir = true;
public Arvore()
{
ptr = null;
}
public int busca(int x, No ptr)
{
int f = 0;
if(ptr == null)
{
f = 0;
}
else if(x == ptr.chave)
{
f = 1; //achou!
}
else if(x < ptr.chave)
{
f = 2;
if(ptr.esq != null)
{
no = ptr.esq; // alterei aqui
f = busca(x,ptr.esq);
}
}
else if( x > ptr.chave)
{
f = 3;
if(ptr.dir != null)
{
no = ptr.dir; // alterei aqui
f = busca(x, ptr.dir);
}
}
return f;
}
public void insere(int x)
{
int f;
No ptnovo;
f = busca(x, ptr);
if(f == 1)
{
return;
}
else
{
ptnovo = new No(x,null, null);
if(f == 0)
{
ptr = ptnovo;
}
else
{
if(f == 2)
{
if( logEsq ) // alterei aqui
{
ptr.esq= ptnovo;
logEsq = false;
}
else
no.esq = ptnovo;
}
else
{
if( logDir ) // alterei aqui
{
ptr.dir= ptnovo;
logDir = false;
}
else
no.dir = ptnovo;
}
}
}
}
public void preordem(No ptr)
{
System.out.println(ptr.chave);
if(ptr.esq != null)
{
preordem(ptr.esq);
}
if(ptr.dir != null)
{
preordem(ptr.dir);
}
}
public void imprime()
{
preordem(ptr);
}
}
Acabei de implementar, pois me disseram que o java ja tinha uma árvore, uma tal de SetTree ou TreeSet, sei lá.
O contador ainda não sei como vou implementa-lo.
Tem que ser com árvore?
Pode não ser a melhor solução mas eu tenho uma sugestão, você poderia usar um HashMap, usando a String como chave, e o contador como valor, e ao tentar adicionar, fazer uma validação, para se caso ja exista a String, só incrementa o valor.
Quanto ao quebrar a linha em palavras, você pode usar o método split, quebrando a String pelo espaço em branco
[quote=digaoneves]Tem que ser com árvore?
Pode não ser a melhor solução mas eu tenho uma sugestão, você poderia usar um HashMap, usando a String como chave, e o contador como valor, e ao tentar adicionar, fazer uma validação, para se caso ja exista a String, só incrementa o valor.
Quanto ao quebrar a linha em palavras, você pode usar o método split, quebrando a String pelo espaço em branco[/quote]
Tem que ser com árvore sim cara. É trabalho de faculdade.
Esse HashMap é pra ser usado para a ávore?
Alguém ae que possa me ajudar?
Já estou um tempão tentando isso e não consigo.
E preciso pra amanhã (sexta, 15/06/12).