Qual collectio usar? [RESOLVIDO]

Pessoal, tenho uma dúvida aparentemente simples, mas que não to sabendo como resolver.
Eu preciso armazenar um par de valores para comparação posterior.
Ex:
[string1, stringRelacionadaComString1]
[string2, stringRelacionadaComString2]
[stringN, stringRelacionadaComStringN]

Depois terei que percorrer a estrutura para verificar todos os elementos adicionados (for, while, ?)verificando a stringN e sua correlata para tratar no código.

To vasculhando a API Collection, mas ainda não entendi como fazer isso.
Alguém tem uma idéia de como fazer?

Um Map<String, String> pode ser percorrido usando-se o método entrySet (que lista os pares) ou keyset (que lista apenas as chaves). Também permite o acesso direto (dada a chave, retorna o valor).

Só depende do seu problema se você precisa de um HashMap, LinkedHashMap ou TreeMap; não sei que tipo de percorrimento do map você precisaria.

Não entendi direito o teu problema, mas uma collection com dois valores pode ser o Map<key, value>, em que você tem uma chave e um valor.
Mas não dá pra te dar certeza devido a não entender bem o problema, se tu puder explicar de outro modo, acredito que possa te ajudar.

O que preciso é o seguinte:
Verifico um xml em que entre outro atributos, existem 2 que preciso verificar: nome e tipo, ou seja 2 strings.
nome=instalacaoA tipo=somenteCopiaElementosParaServidor
nome=instalacaoB tipo=copiaParaServidor_E_ExecutaOsElementosCopiados
etc

Estrutura que guardará as informações
[instalacaoA, somenteCopiaElementosParaServidor]
[instalacaoB, copiaParaServidor_E_ExecutaOsElementosCopiados]
[etc]

Percorro várias tags do xml guardando o nome e seu respectivo tipo nessa lista para usar posteriormente.
Quando eu for verificar a lista, tenho que pegar o primeiro e:
se for a instalacaoA, seu tipo é somenteCopiaElementosParaServidor, implemento o procedimento
ser for a instalacaoB, seu tipo é copiaParaServidor_E_ExecutaOsElementosCopiados, implemento o procedimento
e assim por diante.
Deu uma esclarecida agora?

Eu já havia visto o map, talvez não tenha entendido direito, mas ele guarda algo como [chave(int), valor(string)], não é? Se for realmente isso, não serve.

O Map guarda chave de qualquer tipo… e valor de qualquer tipo…

Talvez seja interessante implementar uma classe que guarde os atributos… nome e tipo

public class Instalacao {
    String nome;
    String tipo;

    // construtores .. getters.. settters
}

E usar um Map<String, Instalacao>…

Ou não criar essa classe e usar um Map<String, String> como dito pelo entanglement

Voce tem que ver o que vai te atender melhor…

Se as associações entre nome e tipo são sempre as mesmas, tu pode definir isso dentro do código, pelo que me parece não é necessário ter dois atributos, talvez apenas pelo nome tu conseguiria definir o que fazer.

Não sei se estou correto em minha análise, mas se estiver, você pode usar o padrão factory pra fazer isso.

E esquece o Map que não é pro teu caso.

[quote]Não sei se estou correto em minha análise, mas se estiver, você pode usar o padrão factory pra fazer isso.

E esquece o Map que não é pro teu caso.[/quote]
Não entendi bem o que vc quis dizer. Mas as associações não são sempre as mesmas e não seria viável definí-las no código.

Acho que não seria interessante, uma vez que só preciso verificar esses valores. Vou tentar usar Map<String, String>.
Se tiver algum exemplo eu agradeço, mas irei pesquisar, pois nunca usei o Map e ainda não conheço.

Obrigado pelas atenções.

Vamos dar um exemplo de mapas.

import java.util.*;

class ExemploMapas {
    private Map<String, String> codigo2procedimento = new LinkedHashMap<String, String>();
    public void carregarMapa1() {
        codigo2procedimento.put ("instalacaoA", "somenteCopiaElementosParaServidor");
        codigo2procedimento.put ("instalacaoB", "copiaParaServidor_E_ExecutaOsElementosCopiados");
        codigo2procedimento.put ("instalacaoC", "formataWindows_E_instalaLinux");
    }
    public void teste1() {
        String procedimento = codigo2procedimento.get ("instalacaoB"); 
        System.out.println (procedimento); // deve imprimir "copiaParaServidor_E_ExecutaOsElementosCopiados"
        procedimento = codigo2procedimento.get ("instalacaoX"); // note que isso não foi configurado
        if (procedimento == null) 
            System.out.println ("Procedimento não encontrado para o código");
        else
            System.out.println (procedimento); 
    }
    public static void main(String[] args) {
        ExemploMapas em = new ExemploMapas();
        em.carregarMapa1();
        em.teste1();
    }
}

Gostei dessa.

Entendi como iterar no Map, eu já ia usar o new HashMap<String, String>() ao invés do LinkedHashMap.
Ao invés de procurar se os elementos existem no HashMap, conforme seu exemplo, tenho que ler os que foram armazenados. Pode até ser que dê na mesma, mas o que melhor atende é percorrer o Map recuperando o que está lá.
A forma de busca é o iterator?

import java.util.*;

class ExemploMapas {
    private Map<String, String> codigo2procedimento = new LinkedHashMap<String, String>();
    public void carregarMapa1() {
        codigo2procedimento.put ("instalacaoA", "somenteCopiaElementosParaServidor");
        codigo2procedimento.put ("instalacaoB", "copiaParaServidor_E_ExecutaOsElementosCopiados");
        codigo2procedimento.put ("instalacaoC", "formataWindows_E_instalaLinux");
    }
    public void teste1() {
        String procedimento = codigo2procedimento.get ("instalacaoB"); 
        System.out.println (procedimento); // deve imprimir "copiaParaServidor_E_ExecutaOsElementosCopiados"
        procedimento = codigo2procedimento.get ("instalacaoX"); // note que isso não foi configurado
        if (procedimento == null) 
            System.out.println ("Procedimento não encontrado para o código");
        else
            System.out.println (procedimento); 
    }
    public void teste2() { 
        // Imprimindo os pares usando entrySet
        for (Map<String, String>.Entry entry : codigo2procedimento.entrySet()) {
            System.out.println (entry.getKey() + "->" + entry.getValue());            
        }
    }
    public void teste3() { 
        // Imprimindo os pares usando keySet
        for (String key : codigo2procedimento.keySet()) {
            System.out.println (key + "->" + codigo2procedimento.get (key));            
        }
    }
    public static void main(String[] args) {
        ExemploMapas em = new ExemploMapas();
        em.carregarMapa1();
        em.teste1();
        em.teste2();
        em.teste3();
    }
}

Sou muito preguiçoso para usar Iterator.

import java.util.*;

class ExemploMapas {
    private Map<String, String> codigo2procedimento = new LinkedHashMap<String, String>();
    public void carregarMapa1() {
        codigo2procedimento.put ("instalacaoA", "somenteCopiaElementosParaServidor");
        codigo2procedimento.put ("instalacaoB", "copiaParaServidor_E_ExecutaOsElementosCopiados");
        codigo2procedimento.put ("instalacaoC", "formataWindows_E_instalaLinux");
    }
    public void teste1() {
        String procedimento = codigo2procedimento.get ("instalacaoB"); 
        System.out.println (procedimento); // deve imprimir "copiaParaServidor_E_ExecutaOsElementosCopiados"
        procedimento = codigo2procedimento.get ("instalacaoX"); // note que isso não foi configurado
        if (procedimento == null) 
            System.out.println ("Procedimento não encontrado para o código");
        else
            System.out.println (procedimento); 
    }
    public void teste2() { 
        // Imprimindo os pares usando entrySet
        for (Map.Entry<String, String> entry : codigo2procedimento.entrySet()) {
            System.out.println (entry.getKey() + "->" + entry.getValue());            
        }
    }
    public void teste3() { 
        // Imprimindo os pares usando keySet
        for (String key : codigo2procedimento.keySet()) {
            System.out.println (key + "->" + codigo2procedimento.get (key));            
        }
    }
    public void teste4() { 
        // Usando entrySet e um iterator - note que é excessivamente verboso
        for (Iterator<Map.Entry<String, String>> it = codigo2procedimento.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, String> entry = it.next();
            System.out.println (entry.getKey() + "->" + entry.getValue());            
        }
    }
    public void teste5() { 
        // Imprimindo os pares usando keySet e um iterator - note que é excessivamente verboso
        for (Iterator<String> it = codigo2procedimento.keySet().iterator(); it.hasNext(); ) {
            String key = it.next();
            System.out.println (key + "->" + codigo2procedimento.get (key));            
        }
    }
    public static void main(String[] args) {
        ExemploMapas em = new ExemploMapas();
        em.carregarMapa1();
        em.teste1();
        em.teste2();
        em.teste3();
        em.teste4();
        em.teste5();
    }
}

entanglement, show de bola seus exemplos, vou adaptar a busca para meu código,mas era exatamente o que eu precisava.
Ajudou muito ter colocado os exemplos, pois eu iria apanhar um pouco. Obrigado.

public void teste4() { // Usando entrySet e um iterator - note que é excessivamente verboso for (Iterator<Map.Entry<String, String>> it = codigo2procedimento.entrySet().iterator(); it.hasNext(); ) { Map.Entry<String, String> entry = it.next(); System.out.println (entry.getKey() + "->" + entry.getValue()); } } public void teste5() { // Imprimindo os pares usando keySet e um iterator - note que é excessivamente verboso for (Iterator<String> it = codigo2procedimento.keySet().iterator(); it.hasNext(); ) { String key = it.next(); System.out.println (key + "->" + codigo2procedimento.get (key)); } }
Usar o Iterator realmente é bem mais trabalhoso e complicado.