Crear dos vectores de punteros en java

Iniciado por Cooltan, 11 Abril 2011, 12:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Cooltan

Hola buenas, necesito ayuda, estoy haciendo un programa que dada una palabra insertada por teclado me devuelva las veces que se repite cada caracter y  tengo que crear dos vectores de puntero y hacer la estructura para que haga el recorrido del vector, y no declarar una variable por cada letra, sino un vector para todo el abecedario.
Me pueden ayudar? Gracias

zepheon

¿Y cómo quieres que te devuelva las veces que se repite cada caracter? ¿Por pantalla, como un array, como un vector? Y otra cosa, ¿es necesario que trabajes con vectores? Porque puede implementarse de otras formas que no sea declarando un vector con todas las letras del alfabeto. Saludos!
Do or do not, there is no try.

Que la masa por la derivada de la velocidad respecto al tiempo te acompañe.

Cooltan

Gracias por responder zepheon, te comento. Tengo que hacer un proyecto y el enunciado es este:

Desarrollar un TAD (clase) en java que implemente un arbol jd, se emplea cuando la información almacenada en los nodos tiene mas de una dimensión, en nuestro caso se almacenaran ristras de caracteres (alfabeto español), asi las dimensiones seran todos y cada uno de los caracteres del alfabeto, y para cada ristra almacenada, el valor de cada dimensión sera la frecuencia de aparición de cada caracter. En el arbol hay dos tipos de nodos, unos internos,  que discriminan para la ordenación y que almacenan el caracter empleado para discriminar y un vector de 10 enlaces, correspondiendo a las frecuencias de 0 a 9 de dicho caracter y un vector de 10 enlaces que apuntan, si es necesario, a una lista simplemente encadenada con las palabras almacenadas ( nodos de información).

Pense que se referia a un arbol trie, pero hablando con el profesor me dijo que no, que se parecia pero que no era, entonces lo que hice fue el main, y dada una palabra por teclado me devolvia por pantalla  el resultado, tipo

System.out.println("El texto contiene "+ contar(frase,'a') +" veces la letra a");

El tema es que tengo que implementarlo y me han dicho que tengo que crear eso dos vectores de punteros, ves alguna manera mas facil?? te pongo lo que tengo exo, a lo mejor asi entiendes mejor mi problema.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




public class Main {
     public static void main(String alfabeto[]) throws IOException
     {
        BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
        String frase;


        System.out.println("Ponga una frase por favor: ");
        frase = lectura.readLine();

       


         System.out.println("El texto contiene "+ contar(frase,'a') +" veces la letra a");
         System.out.println("El texto contiene "+ contar(frase,'b') +" veces la letra b");
         System.out.println("El texto contiene "+ contar(frase,'c') +" veces la letra c");
// hasta la z

}

     public static int contar(String texto, Character letra) {

         return texto.replaceAll("[^"+letra+"]","").length();
       
     }
}

tu como lo harias??? gracias espero tu respuesta

zepheon

#3
Bueno, para empezar, yo creo que lo más difícil es entender el enunciado  :xD

Si no he entendido mal, cada nodo del árbol almacena una palabra, una cadena de caracteres, una ristra de caracteres, como le quieras llamar. Entonces, "detrás" de ese árbol, hay unos nodos auxiliares que contienen el caracter y a un vector con 10 enlaces, y con los que se va a ver cuántas veces se repite cada letra.

El tema es que no sé qué es un TAD ni un arbol jd (he googleado y nada), que entendiendo esos conceptos podría darte una ayuda más certera, por lo menos el árbol, que no me cierra que sus nodos almacenen las palabras y al final te diga que las palabras están en una lista enlazada simple.

En resumen, el enunciado es muy poco claro yo creo, no sé dónde estarás estudiando Java pero espero que no todos los enunciados sean así, o que al menos te lo expliquen bien en teoría para poder después entender este trabalenguas, y ya ni hablar de tutorías o clases donde puedas resolver tus dudas...

En fin, si mi interpretación del enunciado es correcta (y a la espera de que me comentes lo del TAD y el árbol jd para corregirme) yo lo implementaría de la siguiente manera:

Haría dos listas enlazadas, una con los nodos de las palabras a almacenar (nodos A a partir de ahora) y otra con los nodos internos (nodos B) que son cada una de las letras del alfabeto con sus respectivos vectores de frecuencias (de enteros por ejemplo). Dentro de los nodos A almacenaría el String con la palabra y también pondría un vector de nodos B, donde cada posición (correspondiéndose con cada letra distinta de la palabra) apuntaría a la posición correspondiente del vector del nodo B que almacena dicho caracter.  Luego ya depende de cómo sea el árbol jd, esto lo metes de una forma u otra, pero a grandes rasgos yo creo que sería algo así (a no ser que los conceptos de TAD y árbol jd le den la vuelta al problema XD). Y la implementación una vez que se tiene en mente la estructura es muy fácil, así que eso ya te lo dejo a vos, que si estás yendo a clase la idea es que aprendas :D

Cualquier cosa preguntas, saludos!

EDIT: Si pones los códigos entre [ code=java ] código [ /code ] (sin los espacios) se ven mucho mejor  ;)
Do or do not, there is no try.

Que la masa por la derivada de la velocidad respecto al tiempo te acompañe.

Cooltan

Muy buenas, gracias por responder, bueno, la verdad que estoy deacuerdo contigo,el enunciado es una kaka,:) el arbol jd, no existe, el profesor en el enunciado lo explica diciendo que:

un arbol jd se emplea cuando la información almacenada en los nodos tiene mas de una dimensión, y en el caso de la practica se almacenaran ristras de caracteres del alfabeto español, etc..

En cuanto a lo que es un TAD, es un tipo abstracto de datos, pero que en java se le denomina clases. el tema es que el profesor quiere implementar esa clase arbol.

Hablando con un chico de mi facultad, me dijo que el lo habia exo de esta manera te explico,

--- Primero haz un programa que te cuente las letras de una palabra y te diga qué palabras son.

---- Luego hay que hacer dos estructuras y declarar dos vectores de punteros. En Java los punteros no existen, así que son clases.

---- El resto debes crear dos vectores de puntero y hacer la estructura para que haga el recorrido del vector. Por cierto, no declares una variable por cada letra, sino un vector para todo el abecedario.

-----  Crea una estructura NODO con dos NODOS  uno interno y otro externo donde el interno va a la siguiente letra a no ser que sea la letra más alta y el nodo externo que apunta a una lista por ejemplo donde almacena las palabras dependiendo de su frecuencia.

Entonces lo primero ya lo tengo, lo que pasa es q no se seguir para hacer lo de los vectores y los nodos. Que opinas?

Saludos y Gracias



zepheon

Vale, esto ya va evolucionando  ;D

Para empezar, cuando el usuario mete la frase por teclado, podrías hacer un split(" ") para que te devuelva un array con las palabras separadas y así trabajar más fácilmente con cada una. Lo que no entiendo muy bien es la forma de ordenación de las palabras, porque si se las ordena por frecuencia (de las que menos se repiten las letras a las que más se repiten por ejemplo) luego no se podría recuperar la frase en el orden normal, aunque quizás esto no interesa para el caso.

Bueno, lo siguiente sería definir el nodo interno. Por lo pronto va a tener dos vectores, uno de Character con todos los caracteres del alfabeto y otro de Integer, con las frecuencias del 0 al 9 y además una referencia al siguiente nodo interno. En realidad, lo de los vectores no lo veo necesario, y no sólo eso, si no que va a consumir una cantidad absurda de memoria... porque si por cada nodo interno (cada letra no repetida de cada palabra) se van a crear 36 objetos.... echa cuentas  :xD No se, creo que sigo sin entender del todo el enunciado, pero bueno, prosigamos.... tarde o temprano sacaremos una solución decente, y si opina alguien más mejor, que cuantas más cabezas pensando más fácil jaja  ;D
Como decía, el nodo interno tendrá estos dos vectores y de alguna forma tendrás que definirle la letra y la frecuencia en especial que almacena, así que tendrán que haber 2 variables más, una que apunte a la letra y otra que apunte a la frecuencia (por eso decía que no veía necesario lo de los vectores), a no ser que definas los vectores en el nodo externo o en el árbol y al momento de crear el nodo les pases una referencia por parámetros y así te ahorras de crear 20mil vectores, eso ya como veas. También le pasaría como argumento la palabra, pero de la siguiente forma:

Supongamos que estás en el nodo externo, que va a guardar la palabra, una referencia a la siguiente palabra y una referencia al primer nodo interno; dentro de éste creas el nodo interno y le pasas la palabra. ¿Qué va a hacer el nodo interno? Recibe la palabra, mira la primer letra y cuántas veces se repite (ya tenemos el caracter y la frecuencia), luego crea una nueva palabra sin dicho caracter (con split("caracter") y uniendo el array en un nuevo String por ejemplo), crea un nuevo nodo interno y le pasa la palabra, y así sucesivamente hasta que la palabra esté vacía. De esta forma también te ahorras de tener que calcular las frecuencias a parte y le dejas todo el trabajo a los nodos  :D

Luego para ordenar los nodos externos yo sumaría las frecuencias de los internos y lo guardaría en un atributo que represente la "frecuencia absoluta" y ya después jugando con compareTo(), getNext() y setNext() ordenas la lista enlazada.

Esto sigue estando muy verde, pero de a poquito yo creo que estamos llegando a algo, a ver si entre los dos nos vamos dando ideas y llegamos a algo  :xD

Por cierto, cuidado con las mayúsculas y las minúsculas!

Saludos!
Do or do not, there is no try.

Que la masa por la derivada de la velocidad respecto al tiempo te acompañe.