Criar arquivo de saida txt

4 respostas
fabweb

Srs.,

Estou com um arquivo txt quem contém um série de palavras(inclusive repetidas). Como eu faço para ler esse arquivo e armazenar essas palavras de forma que eu consiga contar o numero de vezes que cada uma se repete? Acredito eu que seja utilizando alguma função que permita armazena-la em um vetor, porém não encontrei essa função. Pois além de separar as palavras e contra o numero de vezes que cada uma aparece vou ter que gerar um arquivo ordenando.

Se alguém tiver alguma idéia ou função java que auxilie na implementação desse problema eu agradeço.

abs!

4 Respostas

rubinelli

Em uma palavra: TreeMap.

T

Usualmente você criaria um TreeMap < String, Integer>, onde a chave é a palavra, e o valor é a contagem.

import java.util.*;
...
private SortedMap &lt; String, Integer&gt; frequencias = new TreeMap &lt; String, Integer&gt;();
...
public void inserirPalavra (String palavra) {
    if (frequencias.containsKey (palavra)) {
        frequencias.put (palavra, frequencias.get (palavra) + 1);
    } else {
        frequencias.put (palavra, Integer.valueOf (0));
    }
}
...
public void listarPalavrasPorOrdemAlfabetica() {
    for (Map.Entry &lt; String, Integer&gt; entry : frequencias) {
        System.out.println ("Palavra " + entry.getKey() + " : " + entry.getValue() + " ocorrencia(s)" );
    }
}
...
public void listarPalavrasPorFrequencia() {
    SortedMap &lt; Integer, List &lt; String&gt;&gt; freqs = new TreeMap &lt; Integer, List &lt; String&gt;&gt; (Collections.reverseOrder()); 
    for (Map.Entry &lt; String,Integer&gt; entry : frequencias) {
        if (freqs.containsKey (entry.getValue()) {
            freqs.get (entry.getValue()).add (entry.getKey());
        } else {
            List &lt; String&gt; palavras = new ArrayList &lt; String&gt;();
            palavras.add (entry.getKey());
            freqs.put (entry.getValue(), palavras);
        }
    }
    for (Map.Entry &lt; String, Integer&gt; entry : freqs) {
        System.out.println ("A(s) seguinte(s) palavra(s) ocorreu(ram) " + entry.getKey() + " vez(es):" );
        System.out.println (entry.getValue());
    }
}
fabweb

thingol:
Usualmente você criaria um TreeMap < String, Integer>, onde a chave é a palavra, e o valor é a contagem.

import java.util.*; ... private SortedMap &lt; String, Integer&gt; frequencias = new TreeMap &lt; String, Integer&gt;(); ... public void inserirPalavra (String palavra) { if (frequencias.containsKey (palavra)) { frequencias.put (palavra, frequencias.get (palavra) + 1); } else { frequencias.put (palavra, Integer.valueOf (0)); } } ... public void listarPalavrasPorOrdemAlfabetica() { for (Map.Entry &lt; String, Integer&gt; entry : frequencias) { System.out.println (&quot;Palavra &quot; + entry.getKey() + &quot; : &quot; + entry.getValue() + &quot; ocorrencia(s)&quot; ); } } ... public void listarPalavrasPorFrequencia() { SortedMap &lt; Integer, List &lt; String&gt;&gt; freqs = new TreeMap &lt; Integer, List &lt; String&gt;&gt; (Collections.reverseOrder()); for (Map.Entry &lt; String,Integer&gt; entry : frequencias) { if (freqs.containsKey (entry.getValue()) { freqs.get (entry.getValue()).add (entry.getKey()); } else { List &lt; String&gt; palavras = new ArrayList &lt; String&gt;(); palavras.add (entry.getKey()); freqs.put (entry.getValue(), palavras); } } for (Map.Entry &lt; String, Integer&gt; entry : freqs) { System.out.println (&quot;A(s) seguinte(s) palavra(s) ocorreu(ram) &quot; + entry.getKey() + &quot; vez(es):&quot; ); System.out.println (entry.getValue()); } }

Essas palavras estão em um arquivo txt. no código vc adiciona palavra por palavra, mas como eu faço para que ao invés de inserir palavra por palavra manualmente, ele consiga ler essas palavras do arquivo.txt e ai sim contar suas ocorrências. Por elas estarem em um arquivo.txt, pensei em atilizar alguma função, se é que exite em java, pois não encontrei ainda, que lei esse aquivo e armazena em um array. Aí vem o segundo problema que é como fazer para criar as listas de ocorrencia já que terei que comparar as plavras e armazenar esses numeros. Será que teria que cirar um classe contendo como atributos palavra e ocorrencia ?

Se tiver alguma outra forma de fazer isso que seja mais eficiente eu agradeço…

Desde já agradeço pela ajuda.

Um abraço!

M

Baseando-se no código do thingol, podemos chegar a algo assim:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.TreeMap;

public class ContadorDePalavras {

	private SortedMap<String, Integer> frequencias;
	private Scanner reader;

	public ContadorDePalavras(File source) throws FileNotFoundException {
		reader = new Scanner(source);
		frequencias = new TreeMap<String, Integer>();
		while (reader.hasNext()) {
			inserirPalavra(reader.next());
		}
	}

	private void inserirPalavra(String palavra) {
		if (frequencias.containsKey(palavra)) {
			frequencias.put(palavra, frequencias.get(palavra) + 1);
		} else {
			frequencias.put(palavra, Integer.valueOf(1));
		}
	}

	public void listarPalavrasPorOrdemAlfabetica() {
		for (Map.Entry<String, Integer> entry : frequencias.entrySet()) {
			System.out.println("Palavra '" + entry.getKey() + "': "
					+ entry.getValue() + " ocorrencia"
					+ (entry.getValue() > 1 ? "s" : ""));
		}
	}

	public void listarPalavrasPorFrequencia() {
		SortedMap<Integer, List<String>> freqs = new TreeMap<Integer, List<String>>(
				Collections.reverseOrder());
		for (Map.Entry<String, Integer> entry : frequencias.entrySet()) {
			if (freqs.containsKey(entry.getValue())) {
				freqs.get(entry.getValue()).add(entry.getKey());
			} else {
				List<String> palavras = new ArrayList<String>();
				palavras.add(entry.getKey());
				freqs.put(entry.getValue(), palavras);
			}
		}
		for (Map.Entry<Integer, List<String>> entry : freqs.entrySet()) {
			if (entry.getValue().size() > 1) {
				System.out.println("As seguintes palavras ocorreram "
						+ entry.getKey() + " vez"
						+ (entry.getKey() > 1 ? "es" : "") + ":");
			} else {
				System.out.println("A seguinte palavra ocorreu "
						+ entry.getKey() + " vez"
						+ (entry.getKey() > 1 ? "es" : "") + ":");
			}
			for (String s : entry.getValue()) {
				System.out.println(s);
			}
		}
	}

}

E um método main para testar:

public static void main(String[] args) {
		try {
			new ContadorDePalavras(new File("/etc/samba/smb.conf"))
					.listarPalavrasPorFrequencia();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
Criado 9 de abril de 2009
Ultima resposta 14 de abr. de 2009
Respostas 4
Participantes 4