Dicas de ordenação utilizando Collections

0 respostas
S

Olá amigos, eu preciso pegar a lista de comandos executados no bash do Linux e ordenar os comandos que mais são utilizados. Para abstrair esse problema, inicialmente, não estou carregando a lista .bash_history, mas criei um array para testar se eu conseguia fazer isso, porém como eu sou um pouco receoso quanto a performance queria que os amigos dessem algumas dicas se a forma que fiz está robusto, coerente, com boa performance e o código está limpo.

Essa é a classe que representa um comando:

package _4_collection;

public class Comando implements Comparable {
	Integer prioridade;
	String comando;

	public Comando(Integer prioridade, String comando) {
		this.prioridade = prioridade;
		this.comando = comando;
	}
	
	public Integer getPrioridade() {
		return prioridade;
	}
	
	public void setPrioridade(Integer prioridade) {
		this.prioridade = prioridade;
	}
	
	public String getComando() {
		return comando;
	}
	
	public void setComando(String comando) {
		this.comando = comando;
	}
	
	public int compareTo(Object obj) {
		Comando outroComando = (Comando) obj;
		String atributos = prioridade + comando;
		String outrosAtributos = outroComando.getComando() + outroComando.getPrioridade();
		return atributos.compareTo(outrosAtributos);
	}
	
	public boolean equals(Object o) {
		// se nao for um parametro nulo retornara false
		if(o == null) return false;
		// se nao for um objeto da classe Comando retornara false
		if(! (this.getClass().equals(o.getClass()))) return false;
		// se for um objeto da classe Comando fara cast down
		Comando outro = (Comando) o;
		// verifica se as prioridades sao iguais
		boolean prioridadesIguais = this.getPrioridade() == outro.getPrioridade();
		// verifica se os comandos sao iguais
		boolean comandosIguais = false;
		if(this.getComando() != null)
			comandosIguais = this.getComando().equals(outro.getComando());
		else
			comandosIguais = outro.getComando() == null;
		// retornara o resultado da comparacao
		return prioridadesIguais && comandosIguais;
	}
	
	public int hashCode() {
		String atributos = prioridade + comando;
		return atributos.hashCode();
	}
	
	public String toString() {
		return "Comando: "+ comando +"\nPrioridade: "+ prioridade +"\n\n";
	}
}

Essa é a classe que define a regra de ordenação:

package _4_collection;

import java.util.Comparator;

public class RegraOrdenacao implements Comparator<Object> {
	public int compare(Object o1, Object o2) {
		Comando cmd1 = (Comando) o1;
		Comando cmd2 = (Comando) o2;
		return	cmd1.getPrioridade() < cmd2.getPrioridade() ? -1 :
					(cmd1.getPrioridade() > cmd2.getPrioridade() ? +1 : 0); 
	}
}

Essa é a classe para testar a ordenação do array historicoBash:

package _4_collection;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import _4_collection.RegraOrdenacao;

public class OrdenaListaString {

	public static void main(String[] args) {
		String[] historicoBash = {"who", "ls /", "pwd", "ls /", "ls /home", "ls /"};
		
		Map<String, Integer> historicoDeChaves = new HashMap<String, Integer>();
		// 
		for(String bh: historicoBash) {			
			// A chave (comando) existe na tabela hash?
			if(historicoDeChaves.containsKey(bh)) {
				// incrementa o valor da chave, ou seja pontua o comando
				int hierarquiza = historicoDeChaves.get(bh) + 1;
				historicoDeChaves.put(bh, hierarquiza);
			} else {
				// insere uma nova chave (comando) com pontuacao 1
				historicoDeChaves.put(bh, 1);
			}
		}	

		List<Comando> comandosHierarquizados = new LinkedList<Comando>();
		
		// pega todas as todasAsChaves (todos comandos) da tabela hash
		Set<String> todasAsChaves = historicoDeChaves.keySet();
		// objeto de buscaChave das todasAsChaves (comandos) da tabela hash
		Iterator<String> buscaChave = todasAsChaves.iterator();
		
		// existe ainda chave (comando) para procurar na tabela hash?
		while(buscaChave.hasNext()) {
			// pega a chave na posicao atual de buscaChave
			Object chave = buscaChave.next();
			
			Comando cmd = new Comando(historicoDeChaves.get(chave), (String) chave);
			
			comandosHierarquizados.add(cmd);			
		}

		Comparator<Object> crescente = new RegraOrdenacao();
        Comparator<Object> decrescente = Collections.reverseOrder(crescente);
        
        Collections.sort(comandosHierarquizados, decrescente);
        
        System.out.println(comandosHierarquizados);
	}
}
Criado 19 de outubro de 2011
Respostas 0
Participantes 1