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.
Duvidas ao criar um MAP
7 Respostas
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
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;
}
}
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));
}
Certtooo, agora compreendi o problema!! Eu faria a mesma coisa que nosso colega acima!
Ate mais.
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.
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);
}
}
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...