Map com 3 paramentros

8 respostas
rodpuc

Eu preciso criar um Map que tem uma chave e DOIS elementos, oq “ficaria” assim:

private Map<Etapa, List<String>, List<String>> a;

mas, como todos sabem, o map aceita apenas UMA chave e UM elemento. Qual seria a solução mais elegante para este problema?

8 Respostas

B

Que tal um array de dois elementos?

rodpuc

n me parece mto elegante…

Tchello

Quital um objeto com esses dois elementos? =P

dionat4n

Depende do escopo.

Geralmente, a solução mais elegante é criar uma classe Listas que encapsula as duas listas:

private Map<Etapa, Listas> a;
g4j

Não sei bem qual a funcionalidade disso, mas uma idéia seria criar uma classe com os 2 parametros:

public class Valores {
    private String valor1;
    private String valor2;
}

e armazenar as instancias dessa classe em um map…

Lavieri

se não existir relação entre as 2 listas, o melhor, na minha opinião, é criar um objeto com as dua listas

public class ListaDupla {
   private final List<String> lista1;
   private final List<String> lista2;
   
   public ListaDupla(List<String> lista1, List<String> lista2) {
      this.lista1 = lista1;
      this.lista2 = lista2;
   }

   public List<String> getLista1() {
       return lista1;
   }

   public List<String> getLista2() {
       return lista2;
   }
}
ai vc faria o map assim
private Map<Etapa, ListaDupla> a;  

//podendo fazer

a.get(key).getLista1(); 
//ou
a.get(key).getLista2();

alem disso pode criar outras funcionalidades em Lista Dupla, como contains etc etc etc

T

Em muitos programas que escrevo (devido à influência de linguagens como o C++ e o Scala) eu costumo criar uma classe assim:

class Pair<T, U> {
    public T first;
    public U second;
    public Pair (T first_, U second_) { first = first_; second = second_; }
}

e depois eu uso como se fosse essa classe do g4j. Por exemplo, seu problema original ficaria:

private Map<Etapa, Pair < List < String > , List < String > > a;
Marcelo_FS

Se eu não me engano, o Commons Collections tem uma classe que cria um Map<Object, List<?>> e abstrai isso pra você. Ou seja, quando você adiciona um elemento em determinada chave, ele adiciona esse elemento em uma lista interna... o quê permite ter vários elementos por chave. Quando você dá um get(key), ele retorna um List<?> com os objetos que vc adicionou.

Você ficaria com algo como um Map<Object, List<List>> :slight_smile:

Criado 17 de fevereiro de 2009
Ultima resposta 18 de fev. de 2009
Respostas 8
Participantes 8