Map com 3 paramentros

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?

Que tal um array de dois elementos?

n me parece mto elegante…

Quital um objeto com esses dois elementos? =P

Depende do escopo.

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

private Map<Etapa, Listas> a;  

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…

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

[code]public class ListaDupla {
private final List lista1;
private final List lista2;

public ListaDupla(List lista1, List lista2) {
this.lista1 = lista1;
this.lista2 = lista2;
}

public List getLista1() {
return lista1;
}

public List getLista2() {
return lista2;
}
}[/code]

ai vc faria o map assim

[code]private Map<Etapa, ListaDupla> a;

//podendo fazer

a.get(key).getLista1();
//ou
a.get(key).getLista2(); [/code]

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

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; 

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: