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! 
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<SuaClasse> seuSet = new TreeSet<SuaClasse>();
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: