Página Inicial do Fórum > Java Avançado

Um "ArrayList" bem diferente...



Criar novo tópico   Responder tópico


  1. _vaj
    Posts:42


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Pessoal,

    Tô precisando do seguinte: um "ArrayList" que tenha o seguinte comportamento:

    => Ele tem que funcionar como um HashTable, ou seja, ele tem que implementar chave e valor.
    => Ele tem que permitir que eu coloque valores repetidos nas chaves.
    => Ele tem que ordenar essa lista pelas chaves automaticamente.
    => Ele tem que permitir que eu busque os dados nessa lista por intervalo. Por exemplo: lista.obterdados(10,45). No caso, esse método me retornaria uma lista com todos os elementos, cujo o valor d chave esteja entre 10 e 45.

    Para alguns comportamentos desses, eu até achei classes que me ajudariam na API (HashSet, por exemplo), mas não tem tudo que eu quero.

    Procurei na API da JAVA, mas confesso que não tive muita paciência para procurar.

    Pergunto: alguém sabe de alguma classe que implemente TODOS esses comportamentos descritos acima? Ou eu terei que fazer algumas coisas na mão?

    Sabe como é, né? É sempre bom NÃO reinventar a roda.

    Valeu!
    _________________
    Atenciosamente,
    Victor de Alencar Jesus.




  1. Ataxexe
    Posts:401


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Eu desconheço uma classe pronta na API, mas com um pouco de código você consegue implementar isso. Eu fiz algo muito parecido com o que você precisa, a diferença foi que não aceita chave duplicada, pois ele usava internamente um LinkedHashMap.
    _________________
    Marcelo Varella




  1. _vaj
    Posts:42


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Marcelo, achei a danada!

    O nome dela é TreeMap, ela tem um método chamado submap, que diz o seguinte:

    subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
    Returns a view of the portion of this map whose keys range from fromKey to toKey.

    Agora só tenho que ver se ela aceita valores repetidos. Ela segue uma ordenação natural, mas se eu sobreescrever o método Comparator(), posso fazer ela seguir a ordenação que eu quero, creio eu, já que ele é usado no algortimo de ordenação.

    Vou fazer os testes e posto aqui os resultados.

    Valeu!
    _________________
    Atenciosamente,
    Victor de Alencar Jesus.




  1. Ataxexe
    Posts:401


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Mas ela não aceita chaves repetidas.

    http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html#put(java.lang.Object,%20java.lang.Object)[/url]

    Returns:
    previous value associated with specified key, or null if there was no mapping for key. A null return can also indicate that the map previously associated null with the specified key.


    _________________
    Marcelo Varella




  1. Ataxexe
    Posts:401


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Você pode criar uma lista ordenada de uma classe que tenha chave e valor (igual ao Entry do Map).

    Porque os mapas não aceitam chaves duplicadas, então você teria que usar uma lista ordenada com um objeto de chave-valor
    _________________
    Marcelo Varella




  1. jgbt
    Posts:1214


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    a pergunta que eu fico me fazendo:
    pq eu teria um Map que aceitasse chaves duplicadas???
    qual o comportamento que vc espera que aconteca??
    quando fizer map.get("chaveDuplicada") o que vc espera que aconteça?
    retorne um array referentes a essa chave???
    ate inde eu sei nenhuma implementação das coleções implementa isso, e realmente eu não vejo necessidade de ter isso??? se eu posso ter varios valore iguais p/ uma chave, pq nap ter um array com esses valores e coloca-lo com uma chave unica???

    []'s
    _________________
    João Bier
    JavaFree.org




  1. jgbt
    Posts:1214


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    isso deve ser exercicio de faculdade, certo?
    o que vc pode fazer é procurar a implementação que mais se aproxima do que vc precisa e estender essa classe p/ sobrescrever os metodos que vc precisa mudar o comportamento.

    []'s
    _________________
    João Bier
    JavaFree.org




  1. _vaj
    Posts:42


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44


    a pergunta que eu fico me fazendo:
    pq eu teria um Map que aceitasse chaves duplicadas???



    Eu posso ter chaves iguais, com valores diferentes, não posso? Eu posso querer, por exemplo saber quais são os pontos que estão na coordenada X, de um determinado plano cartesiano e, se eu for classificar essa lista pelas minhas coordenas X, logo, tenho que admitir a possibilidade de repetição nas chaves.


    qual o comportamento que vc espera que aconteca??
    quando fizer map.get("chaveDuplicada") o que vc espera que aconteça?
    retorne um array referentes a essa chave???



    Sim. Se eu fizer: map.get(10), eu quero que todos os objetos que esitverem na coordenada X=10 sejam retornados.


    ate inde eu sei nenhuma implementação das coleções implementa isso, e realmente eu não vejo necessidade de ter isso???



    Pois é... parece esquisito, mas tem lógico. Juro por Deus! rsrsrs!


    se eu posso ter varios valore iguais p/ uma chave, pq nap ter um array com esses valores e coloca-lo com uma chave unica???



    Eu até cheguei a fazer como vc falou. Eu usei o seguinte:

    HashMap> LocalizacaoUnidades

    E aí, quando eu queria acessar alguém eu fazia

    LocalizacaoUnidades.get(indice).get(indice2).metodo_da_unidade, sendo que quando eu fiz com uma massa de dados muito grande, se mostrou lento. Além disso, eu preciso trabalhar com faixas, tipo: "quero saber que está de X1,Y1 até X2,Y2". Acho que se eu tiver que buscar em linhas e colunas ao invés de somente linhas, ficaria muito mais lento.

    Pode ser até que eu esteja trocando seis por meia-dúzia, mas quero tentar. De repente, ganho alguma velocidade.

    Valeu!
    _________________
    Atenciosamente,
    Victor de Alencar Jesus.




  1. _vaj
    Posts:42


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    E não. Não é exercício de faculdade.
    _________________
    Atenciosamente,
    Victor de Alencar Jesus.




  1. ronaldtm
    Posts:2317


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    http://code.google.com/p/google-collections/
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. Ataxexe
    Posts:401


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Isso tá parecendo uma matriz, as chaves seriam as linhas e os valores, as colunas. Acho que por aí dá pra fazer o que você precisa, mas no seu caso, com as "linhas" e "colunas" variáveis.
    _________________
    Marcelo Varella




  1. _vaj
    Posts:42


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Eu tentei fazer dessa forma, como eu falei aí em cima, mas achei lento. Vou tentar de outra forma, mas, tô vendo que vai dar na mesma.

    Uma vez eu li que, quando começa a ficar muito complicado, é pq está errado. Vou dar uma analisada na minha lógica, pq acho que tô dando mole em alguma coisa.

    Ronaldtm,

    Valeu pelos links. Foi para os meus favoritos. Vou dar uma boa lida lá.

    Valeu pessoal!
    _________________
    Atenciosamente,
    Victor de Alencar Jesus.




  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> Java Avançado