Qual estrutura de dados usar? [RESOLVIDO]

6 respostas
RenataFA

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

É algo assim:

POS1  | POS2
------------
  A   |  X
  A   |  Y
  A   |  Z
  B   |  X
  B   |  Z
  A   |  Z
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! :P

6 Respostas

ramilani12

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

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.

RenataFA

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.

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,

ViniGodoy

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);
marciosantri

Eu fiz um exemplozinho que acho que deve funcionar.

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;
    }
}

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

RenataFA

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:

Criado 20 de abril de 2007
Ultima resposta 20 de abr. de 2007
Respostas 6
Participantes 4