Qual estrutura de dados usar? [RESOLVIDO]

No momento tenho uma variável que é um ArrayList<String[]>, onde String[] SEMPRE tem 2 posições.

É algo assim:

[code] POS1 | POS2

A | X
A | Y
A | Z
B | X
B | Z
A | Z
[/code]
Percebam que tenho uma linha idêntica repetida. Não posso ter isso, então antes de inserir cada linha eu teria que verificar se já não existe uma linha igual. A questão é: como fazer isso se estou usando ArrayList?!

Eu sei fazer isso usando loops, etc… mas penso na performace do meu projeto, e por isso pergunto se para montar essa estrutura que estou montando o ArrayList<String[]> seria o mais indicado.

Já me disseram pra usar TreeMap, mas parece que TreeMap não permite chaves repetidas e no meu caso existem como puderam ver.
Eu pensei em HashMap, mas e ai? como conferir se a linha já existe?

Gente, qual é a melhor estrutura de dados pra eu fazer o que quero?!

Obrigada! :stuck_out_tongue:

Como disseram vc poderia usar o HashMap para verificar se chave existe com metodo: containsKey(Object key) , outra forma é vc utilizar o metodo do ArrayList contains(Object value) para verifcar se o valor existe na sua Collection

Eu criaria uma classe com os dois campos, implementaria a interface comparable e depois usaria um TreeSet para isso.

O treeset já garante que não há duplicatas. Além disso, deixa os dados ordenados, conforme a tabela que você mostrou.

Qualquer Map não permitirá uma chave duplicada. Mesmo o HashMap.

[quote=ViniGodoy]Eu criaria uma classe com os dois campos, implementaria a interface comparable e depois usaria um TreeSet para isso.

O treeset já garante que não há duplicatas. Além disso, deixa os dados ordenados, conforme a tabela que você mostrou.

Qualquer Map não permitirá uma chave duplicada. Mesmo o HashMap.[/quote]

De fato, nenhuma permitirá chave duplicada.

Por favor, pode me ajudar? Eu já fiz a classe que tem os dois campos (atributos) e já fiz ela implementar Comparable (já implementei o método compareTo).

Agora como uso o tal TreeSet? Nunca usei e não to entendendo direito…

grata,

Não tem muito mistério.

É muito parecido com uma lista:
Para criar:

SortedSet&lt;SuaClasse&gt; seuSet = new TreeSet&lt;SuaClasse&gt;();

Para adicionar:

seuSet.add(objDaSuaClasse);

Para remover:

seuSet.remove(objDaSuaClasse);

Para percorrer o set, ou você usa o iterator, ou um for each:

for (SuaClasse obj : seuSet) { System.out.println(obj.toString());

Para pegar o primeiro elemento do set:

seuSet.first();

Para pegar o último:

seuSet.last();

Não há métodos para pegar um índice qualquer. Para fazer isso, você pode copia-lo para um arraylist. Várias vezes uso o set para cadastrar os elementos e eliminar duplicatas e depois gero o ArrayList para trabalhar com os elementos através de índices. A cópia em si é bastante rápida.

SuaClasse elem = new ArrayList(seuSet).get(2);

Eu fiz um exemplozinho que acho que deve funcionar.

[code]import java.util.*;

public class Exemplo {

public static void main(String[] args){
    Set<ObjetoTeste> x = new HashSet<ObjetoTeste>();
    
    x.add(new ObjetoTeste("A", 0));
    x.add(new ObjetoTeste("A", 1));
    x.add(new ObjetoTeste("A", 2));
    x.add(new ObjetoTeste("B", 0));
    x.add(new ObjetoTeste("C", 1));
    x.add(new ObjetoTeste("A", 0));
    
    System.out.println(x);
}

}

class ObjetoTeste{
private String s;
private int i;

public ObjetoTeste(String s, int i){
    this.s = s;
    this.i = i;
}

public String toString(){
    return s + "-" + i;
}

public int hashCode(){
    return s.hashCode() + i;
}

public boolean equals(Object o){
    if (o instanceof ObjetoTeste){
        ObjetoTeste x = (ObjetoTeste)o;
        return (this.i == x.i && this.s.equals(x.s));
    }
    else
        return false;
}

}

[/code]

Só o HashCode que eu fiz bem simplezinho. Vc pode incrementá-lo de acordo com a sua classe que dará uma ótima performance.

Resolvido pessoal!

Eu acabei usando a idéia do Vini, fiz de forma que ele até fica ordenado agora,

Muito obrigada à todos que tentaram ajudar!!! :lol: