Duvidas ao criar um MAP

7 respostas
E

Olá, eu estou com duvidas como que eu faço para criar um map de uma classe com metodos gets e sets. E depois fazer a ordenação.

7 Respostas

Vini_Fernandes

Cara, já me deparei com problema semelhante e naquele momento eu resolvi extender a classe HashMap. Porem, o que voce deseja é algo como :

public class SeuMap implements Map{
   //get e set metodos
}

o maior problema que voce enfrentará esta na implementacao dos metodos abstratos da interface Map. As classes que implementam Map (HashMap, TreeMap, LinkedHasMap, etc) utilizam algoritmos de ordenacao e busca que dificilmente voce conseguira uma outra implementacao com performance equivalente! Nao tente isso, é perda de tempo!!! O que voce pode fazer e´:

//escolha uma implementacao de Map, aqui escolhi a Hash
public class SeuMap<K,V> extends HashMap<K,V>{
   public V seuGet(K k){
       return super.get(k);
   }
   
    public void seuSet(K k , V v ){
        super.put(k, v);
    }
}

Espero que tenha ajudado.

Ate mais

E
Vini Fernandes:
Cara, já me deparei com problema semelhante e naquele momento eu resolvi extender a classe HashMap. Porem, o que voce deseja é algo como :
public class SeuMap implements Map{
   //get e set metodos
}

o maior problema que voce enfrentará esta na implementacao dos metodos abstratos da interface Map. As classes que implementam Map (HashMap, TreeMap, LinkedHasMap, etc) utilizam algoritmos de ordenacao e busca que dificilmente voce conseguira uma outra implementacao com performance equivalente! Nao tente isso, é perda de tempo!!! O que voce pode fazer e´:

//escolha uma implementacao de Map, aqui escolhi a Hash
public class SeuMap<K,V> extends HashMap<K,V>{
   public V seuGet(K k){
       return super.get(k);
   }
   
    public void seuSet(K k , V v ){
        super.put(k, v);
    }
}

Espero que tenha ajudado.

Ate mais

Ae, desculpa, mas naum expliquei direito, estou fazendo um trabalho da facul, que é montar um jogo de dados que tem que gravar os recordes e ordenalo, o professor ker que usemos o map. Eu tenho uma classe que os atributos estao como private e sao acessados atráves de Getters e Setters. E eu tenho que criar um Map dessa classe. O que eu tenho que fazer é que a cada novo jogo ele jogue a pontuação e ordene.

Quem nem por exemplo, se eu fosse criar um List da classe Records :

public List<Records> listaRecords = new ArrayList<Records>();

E eu estou usando MVC.

A minha classe Records é essa:
public class Records {
    
    private Placar Integer;
    private Integer Posicao;

    public Placar getInteger() {
        return Integer;
    }

    public void setInteger(Placar Integer) {
        this.Integer = Integer;
    }

    public Integer getPosicao() {
        return Posicao;
    }

    public void setPosicao(Integer Posicao) {
        this.Posicao = Posicao;
    }

}
Lavieri

assim vc pode fazer..

import java.util.Set;
import java.util.TreeSet;

/**
 *
 * @author Tomaz
 */
public class Record implements Comparable<Record> {
    private static final Set<Record> records = new TreeSet<Record>();
    
    public static Set<Record> getRecords() { 
        return records; 
    }
    public static Record addRecord(String nome, Integer resultado) {
        if (nome == null || resultado == null)
            throw new NullPointerException();
        Record placar = new Record(nome,resultado);
        getRecords().add(placar);
        return placar;
    }
    public static Record getRecord(int index) throws IndexOutOfBoundsException {
        if (index < 0 || index > getRecords().size())
            throw new IndexOutOfBoundsException();
        return getRecords().toArray(new Record[0])[index-1];
    }

    private int numeroDoJogo;
    private String nome;
    private Integer resultado;
    private Record(String nome, Integer resultado) {
        this.nome = nome;
        this.resultado = resultado;
        numeroDoJogo = records.size() + 1;
    }
    public String getNome() {
        return nome;
    }
    public Integer getResultado() {
        return resultado;
    }
    public int getId() {
        return numeroDoJogo;
    }
    
    public int compareTo(Record other) {
         return (resultado.equals(other.resultado)) ? //se os resultados forem iguais
             nome.compareTo(other.nome) : //ordene por nome
             -1 * resultado.compareTo(other.resultado); //caso contrario ordene decrescente por resultado.
    }

    @Override
    public String toString() {
        return getNome() + ": " + getResultado();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Record other = (Record) obj;
        if (this.numeroDoJogo != other.numeroDoJogo) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 83 * hash + this.numeroDoJogo;
        return hash;
    }
}

ai o uso é bem simples ^^

public static void main(String ... args) {
        Record.addRecord("Tomaz", 13);
        Record.addRecord("Jose", 12);
        Record.addRecord("Joselino", 2222);
        Record.addRecord("Fulano", 132);
        Record.addRecord("Tico e Teco",1);

        System.out.println("E o top1 é: " + Record.getRecord(1));
    }
Vini_Fernandes

Certtooo, agora compreendi o problema!! Eu faria a mesma coisa que nosso colega acima!

Ate mais.

E
Lavieri:
assim vc pode fazer..
import java.util.Set;
import java.util.TreeSet;

/**
 *
 * @author Tomaz
 */
public class Record implements Comparable<Record> {
    private static final Set<Record> records = new TreeSet<Record>();
    
    public static Set<Record> getRecords() { 
        return records; 
    }
    public static Record addRecord(String nome, Integer resultado) {
        if (nome == null || resultado == null)
            throw new NullPointerException();
        Record placar = new Record(nome,resultado);
        getRecords().add(placar);
        return placar;
    }
    public static Record getRecord(int index) throws IndexOutOfBoundsException {
        if (index < 0 || index > getRecords().size())
            throw new IndexOutOfBoundsException();
        return getRecords().toArray(new Record[0])[index-1];
    }

    private int numeroDoJogo;
    private String nome;
    private Integer resultado;
    private Record(String nome, Integer resultado) {
        this.nome = nome;
        this.resultado = resultado;
        numeroDoJogo = records.size() + 1;
    }
    public String getNome() {
        return nome;
    }
    public Integer getResultado() {
        return resultado;
    }
    public int getId() {
        return numeroDoJogo;
    }
    
    public int compareTo(Record other) {
         return (resultado.equals(other.resultado)) ? //se os resultados forem iguais
             nome.compareTo(other.nome) : //ordene por nome
             -1 * resultado.compareTo(other.resultado); //caso contrario ordene decrescente por resultado.
    }

    @Override
    public String toString() {
        return getNome() + ": " + getResultado();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Record other = (Record) obj;
        if (this.numeroDoJogo != other.numeroDoJogo) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 83 * hash + this.numeroDoJogo;
        return hash;
    }
}

ai o uso é bem simples ^^

public static void main(String ... args) {
        Record.addRecord("Tomaz", 13);
        Record.addRecord("Jose", 12);
        Record.addRecord("Joselino", 2222);
        Record.addRecord("Fulano", 132);
        Record.addRecord("Tico e Teco",1);

        System.out.println("E o top1 é: " + Record.getRecord(1));
    }

Ae Lavieri, vlw pela dica, mas tem um pequeno problema, na dica que vc me deu, vc usou Set, não Map, e estou precisano eh de usar o map.

Vini_Fernandes

Cara, uma outra forma de fazer eh (estou me apoiando no codigo do colega Tomaz). Aqui resolvi separar as classes Record, Jogador e a classe que vai mapear os jogadores aos records:

import java.util.*;   
//modelando a classe Record  
class Record implements Comparable{   

    private Integer resultado;   

    public Record( Integer resultado) {   
        this.resultado = resultado;   
       }   
    public Integer getResultado() {   
        return resultado;   
    }   
           
    public int compareTo(Object other) {   
         return this.getResultado().compareTo(((Record)other).getResultado()); 
    }   
  
   
    public String toString() {   
        return "record: " + getResultado();   
    }   
  
   
    public boolean equals(Object obj) {   
        if (obj != null && obj instanceof Record && this.getResultado() == ((Record)obj).getResultado()) {   
            return true;   
        }   
       return false;
   }   
  
   
    public int hashCode() {   
        
        return this.getResultado();   
    }   
}  

//modelando um Jogador
class Jogador implements Comparable{
	private String nome;
	
	public Jogador(String nome){
		this.nome = nome;
	}
	
	public void setNome(String nome){
		this.nome = nome;
	}
	public String getNome(){
		return nome;
	}
	public int compareTo(Object o ){
		return this.getNome().compareTo(((Jogador)o).getNome());
	}
	public boolean equals(Object obj) {   
        if (obj != null && obj instanceof Jogador && this.getNome() == ((Jogador)obj).getNome()) {   
            return true;   
        }   
       return false;
   }   
	public int hashCode(){
		return this.getNome() == null ? 0 : this.getNome().hashCode();
	}
}

final class RecordMap {
	//escolhi TreeMap para ordenar os joadores pelo nome
	//defini jogador como sendo a chave do mapa pois um unico jogador deve ter um unico record
	private static Map<Jogador, Record> records = new TreeMap<Jogador, Record>();
	
	public static Map<Jogador, Record> getRecordMap(){
		return records;
	}
	
	public static Set<Jogador> getJogadores(){
		return records.keySet();
	}
	
	public static Set<Record> getRecords(){
		Set<Record> set = new TreeSet<Record>();
		
		for(Record r: records.values())
			set.add(r);
		return set;
	}
}

public class RecordTeste{
	public static void main(String[] x){
		Map<Jogador, Record> records = RecordMap.getRecordMap();
		records.put(new Jogador("vanessa"), new Record(555111));
		records.put(new Jogador("vinicius"), new Record(111));
		records.put(new Jogador("carmem"), new Record(133));
		records.put(new Jogador("andre"), new Record(555111));
		
		
		//imprimindo os jogadores
		for(Jogador j : records.keySet())
			System.out.println(j.getNome());
		
		//imprimindo os records
		for(Record r : RecordMap.getRecords())
			System.out.println(r);
	}
}
Lavieri
edileyoliveira:
Ae Lavieri, vlw pela dica, mas tem um pequeno problema, na dica que vc me deu, vc usou Set, não Map, e estou precisano eh de usar o map.

Bom... a intenção era dar uma resposta elegante ao problema... além do mais a solução usa maps ^^ ... implicitamente, mas usa =x

c vc olhar o código de TreeSet verá

//construtor de TreeSet
    public TreeSet() {
	this(new TreeMap<E,Object>());
    }

add de treeSet

public boolean add(E e) {
	return m.put(e, PRESENT)==null;
    }

etc etc etc...

enfim... se vc quer fazer com Maps, tb é simples

Comparator<Integer> ordemInversa = new Comparator<Integer>() {
    public int compare(T o1, T o2) {
         return o2.compareTo(o1);
    }
};

Map<Integer,String> records = new TreeMap<Integer,String>(ordemInversa);

assim fica simples... por exemplo... "Cicrano" -> "2323221 pontos" usado... addRecord("Cicrano",2323221);

public void addRecord(String nome, Integer resultado) {
   records.put(resultado,nome);
}

pronto ... a tree é ordenada... e ta na ordem de resultados... vc pode pegar qualquer resultado facil dali fazendo...

public Record getRecord(int index) {
     Set<Integer> keys = records.keySet();
     if (index > keys.size() || index < 1)
         return null;
     Integer key = keys.toArray(new Integer[0])[index-1];
     return new Record(records.get(key),key);
}

pronto tai feito com maps...

Criado 31 de março de 2009
Ultima resposta 2 de abr. de 2009
Respostas 7
Participantes 3