Problemas com Casting (eu acho)

7 respostas
V

Olá pessoal!

Estou com uma dúvida…

Eu pesquisei na internet sobre como calcular a MODA de uma lista…

No meu caso eu tenho uma lista ligada por cursores…

onde:

uso = posição primeiro elemento;

livre = primeira posição livre;

prox[livre] = próxima posição livre da lista;

prox[uso] = posição do próximo elemento;

info[uso] = o primeiro elemento propriamente dito.

OMEGA = quando o elemtno for o último ele aposta para OMEGA. Exemplo: prox[uso] = OMEGA; Nesse caso a lista tem apenas um elemento. OU prox[livre] = OMEGA; Nesse caso a lista está cheia, nenhuma posição livre.

Se eu atribuo o valor info[posicao] para alguma variável, essa variável deve ser Object.

Object x = info[posicao];

Ou então eu devo fazer um casting…

Integer x = (Integer)info[posicao];

Bom, agora o meu problema, tenho uma lista com N elementos. Todos eles são do tipo Object.

Para calcular a MODA da lista, eu precisaria (hipotéticamente) de um HashMap e um HashSet.

Mas não é possivel fazer o casting de Object para Map ou qualquer outro objeto para Map.

Desenvolvi (depois de muitas pesquisas) o código abaixo.

public Object Moda() {
        
        Map valores = new HashMap();
        Integer maior = null;
        Set resultado = new HashSet();
        int temp = uso;
        while (prox[temp] != OMEGA) { //laço para percorre toda a lista.
            valores = info[temp];
            Iterator iterator = valores.keySet().iterator();
            while (iterator.hasNext()) {

      Integer valor = (Integer)iterator.next();
      
      Integer current = (Integer)valores.get(valor);
      
      if (maior == null) {
        maior = current;
      }
      
      if (maior.compareTo(current) <= 0) {
        maior = current;
        resultado.add(valor);
      }
    }
    
    iterator = resultado.iterator();
    
    while (iterator.hasNext()) {
      
      Integer numero = (Integer)iterator.next();

      if (((Integer)valores.get(numero)).compareTo(maior) < 0) {
        iterator.remove();
      }
    }
    
    temp = prox[temp];
    }
    return resultado;
}

Contudo na linha valores = info[temp]; dá erro…

found : java.lang.Object
required: java.util.Map

Alguém pode me ajudar a arrumar esse erro?

Ou me ajudar, sem dar o código pronto, bolar um outro algoritmo para calcular a MODA sem usar Map…

Eu pensei em vários algoritmos, mas todos estão errados pois não conseguem calcular a MODA se ela for bimodal, trimodal ou polimodal.

Abraço!

7 Respostas

H

Não entendi esse algoritmo, mas imagino que você teria que colocar esse object [b]dentro[b] do map e não fazer a atribuição. Tipo:

valores.put(info[temp])

Como eu disse, não entendi esse algoritmo pelo seu código. Achei mais fácil pensar num algoritmo aqui, que permita encontrar moda, seja bimodal, trimodal, trocentomodal…
Abaixo o pseudocódigo:

//para guardar os elementos que forem moda (independente de quantos forem);
  Vector<Object> modas = new Vector<Object>();

  //para guardar temporariamente os dados da lista
  Vector<Object> dados = new Vector<Object>();

  //copiei do seu código: posição do primeiro elemento
  int temp = uso;

  //para guardar a maior quantidade
  int maior = -1;

  //transfere os dados do array para o vector dados
  enquanto prox[temp] != OMEGA
  faça
    adicione ao vector dados o elemento na posição temp;
    faça temp apontar para o proximo elemento;
  fim

  //loop que percorre todo o vector de dados
  enquanto o vetor de dados nao for vazio
  faça

    //pega o primeiro elemento do vector
    Object atual = primeiro elemento do vector

    //para guardar a quantidade de vezes que o elemento atual aparece
    int qtd = 0;


     enquanto houver ocorrência do atual em dados
     faça
       retire a ocorrência de atual em dados
       qtd++
     fim


    /*se o contador for maior do que a maior quantidade anterior (variável maior),
      é porque os anteriores não eram de fato moda.
    */

    se qtd > maior
    faça
      remova os outros elementos de modas;
      inclua em modas o elemento atual;
      maior = qtd;
    fim
   

    /* se o contador for igual à maior quantidade anterior (variável maior),
       então o elemento atual é mais uma moda. Nesse caso
    */
    se qtd == maior
    faça
      inclua no vector modas o elemento atual;
    fim
  fim

Sei que você pediu prá não mandar código pronto, mas eu não sou muito bom prá pseudocódigo, então em caso de dúvidas, tá aí a implementação.

//para guardar os elementos que forem moda (independente de quantos forem);
  Vector<Object> modas = new Vector<Object>();

  //para guardar temporariamente os dados da lista
  Vector<Object> dados = new Vector<Object>();

  //copiei do seu código: posição do primeiro elemento
  int temp = uso;

  //para guardar a maior quantidade
  int maior = -1;

  //transfere os dados do array para o vector dados
  while (prox[temp] != OMEGA){
    dados.add(info[temp]);
    temp = prox[temp];
  }

  //loop que percorre todo o vector de dados
  for (dados.size() != 0){

    //pega o primeiro elemento do vector
    Object atual = dados.firstElement();

    //para guardar a quantidade de vezes que o elemento atual aparece
    int qtd = 0;

    //enquanto o existir alguma ocorrência do objeto no vector
      remova-o do vector e incremente o contador
    while (dados.removeElement(atual))
      qtd++;


    /*se o contador for maior do que a maior quantidade anterior (variável maior),
      é porque os anteriores não eram de fato moda. Nesse caso:
        remova as outros elementos do vector modas;
        inclua no vector de modas o elemento atual;
        atribua à variável maior a quantidade do elemento atual;
    */
    if (qtd > maior){
      maior = qtd;
      modas.removeAll();
      modas.add(atual);
    }

    /* se o contador for igual à maior quantidade anterior (variável maior),
       então o elemento atual é mais uma moda. Nesse caso:
         inclua no vector modas o elemento atual;
    */
    if (qtd == maior)
      modas.add(atual);
  }

  //Aqui você  terá no vector modas todos os elementos que são moda.

Espero ter ajudado…

H

Só por curiosidade, posta o algoritmo sobre o qual você implementou ou link para a página onde você encontrou…

V

hadilson, valeu pela ajuda!

qnd chegar em casa vou testar esse algoritmo e posto a resposta para a sua pergunta.

Abraço!

Editando…

Cara, só a linha modas.removeAll(); que não tá rolando nesse código…

<blockquote>cannot find symbol

symbol  : method removeAll()

location: class java.util.Vector<java.lang.Object>

modas.removeAll();

^

1 error

Exit code: 1

Como como funciona o Vetor do java? Por que acho que dá para substituir essa linha por um WHILE…

V

Implementação da Linked List...

public class LLSLCursor {

// membros atributos (constantes e variáveis) da classe

   public  final int MAXLIST = 20; // máximo de células nas listas
   private final int MAXLINE =  5; // máximo elementos da LLSL por linha
   private final int OMEGA = -1;   // constante para finalizar lista
  
   private Object info[];     // array para info de cada célula
   private int prox[];        // array para prox (aponta para próxima célula)
   private int livre = 0;     // primeira posição livre do array na lista
   private int uso = 0;       // primeira posição ocupada do array na lista
  
// membros métodos (ou serviços) da classe

/*
#############################################################################
###   Implementa Operadores Básicos que caracterizam LLSL como um TAD    ###
#############################################################################
*/
/****************************************************************************
* Construtores para incializar os objetos quando instanciados.              *
****************************************************************************/
public LLSLCursor() { // construtor default para inicializar a lista
 livre = 0;                          // posição do primeiro elemento na lista livre
 uso = OMEGA;                        // posição do primeiro elemento na lista em uso
 info = new Object[MAXLIST];         // aloca array para os elementos da lista
 prox = new int[MAXLIST];            // aloca array para os elos (links) da lista
 for (int i=0; i < (MAXLIST-1); i++) // iteração para formar os links da lista livre 
      prox[i] = i + 1;               // elemento atual aponta para o próximo  
 prox[MAXLIST-1] = OMEGA;            // último elemento não possui próximo 
} // construtor

/****************************************************************************
* Inicializa (ou cria) a LLSL com n células, tornando-a vazia.              *
****************************************************************************/
public void InicializaLLSL() {    
 livre = 0;                          // posição do primeiro elemento na lista livre
 uso = OMEGA;                        // posição do primeiro elemento na lista em uso
 for (int i=0; i < (MAXLIST-1); i++) // iteração para formar os links da lista livre 
      prox[i] = i + 1;               // elemento atual aponta para o próximo  
 prox[MAXLIST-1] = OMEGA;            // último elemento não possui próximo 
} // InicializaLLSL
}//LLSL

Abraço!

H

Ooops… foi mal =[
Substitua:

modas.removeAll();

por:

modas.removeAllElements();

O Vector funciona basicamente como um array: contém elementos que podem ser acessados por índice inteiro. No entanto seu tamanho pode aumentar ou diminuir dinamicamente, para poder se ajustar aos objetos, e possui diversos métodos para tratamento desses elementos. (retirado da especificação da API).

Dá prá fazer com while sim, mas o Vector já faz isso prá gente… =]

[]'s

V

hadilson,

cara, não sei se é burrice minha, mas esse código só calcula quando a moda é simples…

depois de todo o código eu coloquei

return modas

dai ele só retorna o primeiro elemento que é moda (caso tenha mais que uma).

depois eu tentei assim

return modas.subList(0, modas.size())

aconteceu a mesma coisa…

como eu devo retornar para me mostar todas as modas da Lista?

abraço!

H

Fiz umas correções e testei (pela primeira vez =]). Em anexo está o código e comentários.

Executa o código como está prá ver. Tem uns printf da vida lá, prá debugar.
Acho que agora funciona…rsrs

[]'s

Criado 14 de setembro de 2007
Ultima resposta 16 de set. de 2007
Respostas 7
Participantes 2