Collections, Ajuda

6 respostas
P
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CollectionTest {


 public static Collection fill(Collection c) {
     c.add("Enterprise Server");
     c.add("Department Server");
     c.add("Workstation");
     c.add("Workstation");
     return c;
 }

 public static Map fill(Map m) {
     m.put("Enterprise Server", "Sun Solaris");
     m.put("Enterprise Server", "HP-UX");
     m.put("Department Server", "Linux");
     m.put("Workstation", "MS Windows");
     m.put("Workstation", "Macintosh");
     return m;
 }


 public static void doPrintContainer() {

     Collection p1;
     Map m1;

     List  a1 = new ArrayList();
     p1 = fill(a1);
     System.out.println("    " + p1 + "\n");
     
     Map a2 = new HashMap();
     m1 = fill(a2);
     System.out.println("" + m1.get("Enterprise Server"));
     System.out.println("" + m1.get("Workstation"));
 }
 public static void main(String[] args) {
     doPrintContainer();
 }
}

Vejam o codigo acima,

Estou querendo fazer o seguinte, Veja o metodo fill onde o retorno e uma interface map? ok?

Esta vendo que estou empilhando a mesma chave na qual e (“Enterprise Server”), com valores diferentes, so que no java, ele faz o overhead ou seja sobreescreve aquela posicao de memoria, o que quero fazer que uma chave, possa ter varios valores,

ou seja,

quando eu der m1.get(“Enterprise Server”), apareca as chaves SUN-SOLARIS e HP-UX, me disseram que tem como fazer usando collections, como seria afinal de contas?

:roll:

6 Respostas

Rafael_Steil

Um Map nao pode te chaves iguais. Voce teria que guardar uma outra estrutura no value… pode ser qq coisa ,como um arraylist, uma classe propria tua etc… algo como

List l = new ArrayList();
l.add("Item 1");
l.add("Item 2");
l.add("Item 3");

Map m = new HashMap();
m.put("chave1", l);

ai, qdo vc der um m.get(“chave1”), vc vai receber um list com todos os valores.

Rafael

T

Realmente acho isso uma pequena “omissão” do pessoal que definiu as Collections do Java. Deveriam ter definido um “multimap” como na STL do C++ (bom, as coisas nunca vêm completas - em STL o template “hash_map” não foi definido logo na primeira versão, e existem duas implementações completamente diferentes: a da Microsoft e a da SGI. Como de costume, a implementação da Microsoft é mais difícil de usar…)
O “multimap” do C++ é análogo a um Map de ArrayLists.
Para fazer o que você quer, use um Map contendo Lists (implementação: HashMap ou TreeMap de ArrayLists).
Dependendo do seu problema talvez você queira um Map contendo Sets (se por exemplo uma chave for associada vários valores, mas que não sejam repetidos).

P

List list = new ArrayList();

list.add(new ListMap(1,10.0.0.110));

list.add(new ListMap(2,10.0.0.111));

list.add(new ListMap(2,10.0.0.112));

list.add(new ListMap(3,10.0.0.113));

list.add(new ListMap(4,10.0.0.114));
Map map = new HashMap();

map.put(1, list);

System.out.println(map.get(1));

Como seria, agora, para pegar o 1 e o ip dentro do list? usando map, teria que fazer type casting?

P

niguem?
:oops:

Rafael_Steil

psb:
niguem?
:oops:

Hmm… vc postou a mensagem as “11:04:13”… 20 minutos depois ninguem respondeu AINDA? algo esta muito errado… :shock:

Bom, sim, vc precisa fazer cast. Faca cast para ListMap e acesse os membros.

Rafael

P

Problema resolvido

public class ListMapx  {
	
	private int id;
	private String ip;

	/**
	 * @param i
	 * @param string
	 */
	public ListMapx(int i, String string) {
		this.id = i;
		this.ip = string;
	}

	public static void main(String[] args) {
		List list = new ArrayList();
		
		list.add(new ListMapx(1,"10.0.0.110"));
		list.add(new ListMapx(2,"10.0.0.111"));
		list.add(new ListMapx(2,"10.0.0.112"));
		list.add(new ListMapx(3,"10.0.0.113"));
		list.add(new ListMapx(4,"10.0.0.114"));
		
		Map map = new HashMap();
		map.put("1", list);
		
		for (Iterator i=map.values().iterator(); i.hasNext(); ) {
			   List ok = (List) i.next();
			   for(Iterator o=ok.iterator(); o.hasNext();) {
			   	   ListMapx matriz = (ListMapx) o.next();
			   	      System.out.println(matriz.id);
			              System.out.println(matriz.ip);
	       }
	    }
	}
}

Resultado: 

1
10.0.0.110
2
10.0.0.111
2
10.0.0.112
3
10.0.0.113
4
10.0.0.114

:smiley:

Criado 7 de dezembro de 2004
Ultima resposta 7 de dez. de 2004
Respostas 6
Participantes 3