Dudas de Java

Started by Drumpi, January 29, 2011, 01:06:43 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Noivern

No sabía eso de las matrices irregulares, acabo de googlear y es como un arreglo de arreglos... y estos últimos de tamaño variable distintos entre si... en escasa experiencia, matrices las he usado en... a ver... ¿experimentos de aprendizaje? voy a puras colecciones ArrayList y HashMap, soy un informático de mentira xD

Drumpi

No, sólo dan un uso a la capacidad de poder asignar una cantidad de memoria indeterminada a priori a una variable. Es decir, un array no es más que asignar X espacios de memoria a una variable:

private int[] datos;
...
datos=new int[20];

Pues si a una posición de dicho array se le asigna otras Y posiciones de memoria, pues listo:

private int[][] datos;
...
datos=new int[20];
datos[0]=new int[3];
datos[1]=new int[5];
...

Así tenemos una primera fila con 3 posiciones, una segunda con 5... así hasta 20 filas.
Normalmente, en C y muchos lenguajes, esta memoria se reserva en tiempo de compilación, prácticamente, y se guardan X posiciones de memoria consecutivas para el array (X*Y para las matrices).
Pero Java asigna grupos de memoria. Por decirlo de forma sencilla, sólo guarda filas, y una matriz no es más que una fila de filas (es como tener una lista enlazada de listas enlazadas), y estas últimas no tienen que tener todas el mismo tamaño. Esto consumirá algo más de memoria y algo más de cálculos para hayar la posición, supongo que por eso el rendimiento cae respecto a C.

Lo de "programadores de verdad" no te lo tomes literalmente, es un mote que le he puesto a esta gente. Los podría haber llamado "los que presumen de saber programar sin tener ni idea de qué es un ordenador" perfectamente :D :D :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Noivern

¿y te gustó el sistema?
Si es así, hechale una ojeada a los ArrayList y los Iterator :D

Drumpi

Ni me gusta ni me deja de gustar, porque de momento no le veo la utilidad práctica a la mitad de las cosas que veo ^^U
Por ejemplo, acabo de ver la herencia. No sé cómo será en C, pero en java, a un "objeto" (clase) se le definen unos atributos y una serie de funciones. Luego se crea otra que "depende" de la primera y añade nuevos atributos y funciones. En este caso ¿No es más fácil añadir dichas funciones a la primera clase y listo? tener dos objetos distintos con funciones del mismo nombre que hagan cosas distintas puede liar (por lo menos, el ejemplo que he hecho, una clase OPERACIONES con subclases SUMA y RESTA que añaden la función OPERAR, en un caso suma dos valores y en el otro los restan).

Pero bueno, tomo notas para cuando acabe el curso, porque veo que me voy a quedar en lo básico, que es lo que hace cualquier lenguaje.
Ahora he empezado lo divertido: trabajar con ventanas. Veo muchas funciones por ahí, a ver si hay alguna que elimine el fondo de la ventana y puedo hacer cosas entretenidas :D
Nah, de momento veo cada vez más posible hacer el compilador de Venturer en Java, por sencillo, no por otra cosa :P
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Rein (K´)ah Al-Ghul

Lo mejor en java es usar todos objetos, aun reemplazando los tipos primitivos.
El tema ese de la herencia es que TODO ser un objeto, por lo tanto heredar de otro objeto, salve al todo poderoso Object el objeto original :P
La herencia multiple no existe en java, para añadir comportamiento se necesitan de las interfaces, que obligan a implementar metodos.

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Yawin

Quote from: Drumpi on February 02, 2011, 08:38:39 PM
Ni me gusta ni me deja de gustar, porque de momento no le veo la utilidad práctica a la mitad de las cosas que veo ^^U
Por ejemplo, acabo de ver la herencia. No sé cómo será en C, pero en java, a un "objeto" (clase) se le definen unos atributos y una serie de funciones. Luego se crea otra que "depende" de la primera y añade nuevos atributos y funciones. En este caso ¿No es más fácil añadir dichas funciones a la primera clase y listo? tener dos objetos distintos con funciones del mismo nombre que hagan cosas distintas puede liar (por lo menos, el ejemplo que he hecho, una clase OPERACIONES con subclases SUMA y RESTA que añaden la función OPERAR, en un caso suma dos valores y en el otro los restan).

Pero bueno, tomo notas para cuando acabe el curso, porque veo que me voy a quedar en lo básico, que es lo que hace cualquier lenguaje.
Ahora he empezado lo divertido: trabajar con ventanas. Veo muchas funciones por ahí, a ver si hay alguna que elimine el fondo de la ventana y puedo hacer cosas entretenidas :D
Nah, de momento veo cada vez más posible hacer el compilador de Venturer en Java, por sencillo, no por otra cosa :P

La herencia es muy facil de entender su utilidad. Imagina que estás haciendo un programa para gestionar el almacén de la Fnac. Necesitas gestionar los productos. Darlos de alta etc... No puedes hacer un objeto genérico llamado producto, porque no todos los productos tiene los mismos datos. Los dvd's no tienen editorial, pero los libros no suelen llevar región. Para eso, creas una clase llamada producto, que tiene todo aquello que todos los productos tienen en común y luego cuando creas el objeto libro, haces que herede de la clase producto.

Imagina que dos años después al dueño de la fnac se le ocurre vender un producto nuevo, pues el programador que esté en ese momento, sólo tiene que crear un objeto nuevoproducto y heredar la clase producto que ya diseñaste tu.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Pos nada, ya he terminado el tutorial de www.javaya.com.ar (anótatelo fede, que se me olvidó parártelo ^^U). He tardado creo que tres semanas en hacer los 54 temas con un total de unos 150 proyectos simples, más o menos, entre ejemplos y ejercicios.
Y he aprendido lo mismo que me enseñaron en el primer año de facultad sobre C++ (o incluso algo más) ;D

La guinda la han puesto un par de ejercicios de manejo de árboles binarios ordenados, pero el que más me ha gustado ha sido el poder crear mi primer juego: el buscaminas ;D
Vaale, es un juego muy tonto y muy simple, pero es el ejemplo más complejo del temario y lo he hecho un poco "a mi estilo" y le he añadido algunas cosillas mías (tiempo de desarrollo, un día ^^U).

Me gustaría poder enseñároslo, pero una de esas "pequeñas" cosas que no te explica el tutorial es a obtener un fichero ejecutable de alguna forma ^^U Sé que el código está en un fichero .java, y lo que se genera en un fichero .class que no sé ni como manejar :P

En fin, he empezado otro tutorial más completo, en el que seguro que se explica eso y mucho más. Sólo espero que el estar basado en java 1.2 no sea un lastre.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Noivern

#22
Mira, en el netbeans se puede generar el paquete binario distribuible con la opción "build main project" o con la "clean and build main project" y te deja tu archivo "nombreAplicacion.jar" en la carpeta dist del proyecto. Si incluiste librerías extra, se crea una carpeta con las librerias.

Uhm... en el eclipse en el menu project está la opción de build pero no sé como se comportará en proyectos java, no tengo ni idea que  carpetas genera. Al estar configurado para trabajar con el sdk de android el binario me lo crea automáticamente al compilar y lo deja en la carpeta bin del proyecto. Quizás es similar en java. Lo que es seguro, es que debes buscar tu archivo .jar en alguna carpeta del proyecto :P

Por cierto drumpi, he mirado a la rápida la última página del curso que hiciste, la que habla de listas. Interesante, pero lo veo muy C y no Java. Aclaro que soy un noob absoluto con punteros!!.
Por lo que vi, en ese apartado estan reinventando la rueda...

Mira esta clase tan maravillosa que hay en la API:
http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html

Te olvidas de los punteros con esa. Ya tiene todos los métodos que tenias que hacer a mano, puede ir cualquier objeto dentro y además si implementas en tus objetos algunas interfaces, "Comparable" creo que era, no lo recuerdo ahora, puedes utilizar ciertos métodos estáticos que están para utilizar con colecciones para ordenar automáticamente según tu criterio tus objetos. Además existen otros tipos de listas más eficientes como los HashMap que se utilizan con una key única para que te devuelva un objeto antes ingresado.

No puedo ser más específico puesto que lo utilicé hace tiempo en un reproductor de mp3 que hice en java utilizando unas librerias hechas en java para leer y reproducir un mp3 frame a frame; incluso tuve que modificarla y recompilarla para poder agregar un control de volumen ;D. Eso si, nunca lo terminé xD. Me faltó sincronizar los hilos para q cuando le das a pausa se pause inmediatamente y dar una interfaz más acabada pero es 100% funcional.


PD : ¿tienes algun equipo con android? D:
PD2: Si quieres cuelgo el reproductor de mp3 jojo :3

Drumpi

Como dije en su momento, es un tutorial para los que no tienen ni idea de programar, así que te enseñan todo lo que un programador necesita saber, punteros incluidos... aunque claro, en Java eso no existe como tal ^^U
De todas maneras me ha venido de miedo para repasar lo que sabía de C++, que hacía años que no lo tocaba.

Obviamente, ahora necesito uno más completo, y empollarme todas las librerías habidas y por haber, que es lo que acabo de empezar ahora.

Lo del binario no tengo ni idea, yo siempre le doy al boton de "build and run" y se me ejecuta, y bicheando por las carpetas he encontrado las dos que os digo. Tendré que revisar las opciones a ver qué encuentro, aunque tenía la esperanza de verlo en alguno de los dos tutoriales. Guglearé un poco.

Lo del tema de sonido me interesa, pero por el momento es demasiado avanzado para mi nivel actual. Es más, me gustaría hacer una para Bennu en C, pero aun tengo que repasar algunas cosillas en C y averiguar cómo trabajar con sonido en PC. Quiero crear filtros, efectos simples y aumentar las capacidades de reproducción de música modular, que de momento son poco menos que básicas (reproducir, pausar y parar).


Y no, no tengo nada Android. Tengo en el punto de mira un móvil Xperia X8, para el que aun me faltan unos cuantos puntos, así que mientras mato el tiempo con cursos, tutoriales y java clásico ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Le estoy dando vueltas a mi primer programa "serio" en Java, y tengo mis dudas de cómo llevarlo a cabo.

Os cuento, se trataría de un nuevo compilador para Venturer ¿Se podría hacer en Bennu? sí, pero con Java lo haría cinco veces más rápido (tranquilo, Splinter, el intérprete seguirá siendo en Bennu ;) ).
Bien, la idea es tener un area de texto en el que ir viendo el código, según se pulsen los botones y todo lo demás. Cada linea de código tendrá asociada una estructura de datos (una clase) en la que irá la linea de texto a mostrar en dicho recuadro.

El problema es que el area de texto trata su contenido como una única línea de texto. Cuando quiero convertir un nuevo nodo creado con un botón en una nueva linea de ese cuadro no hay problema (reconstruyo todo el texto en base a cada línea de la lista de nodos), pero ¿y si quiero crear la nueva línea en dicho cuadro de texto? ¿o editar alguna de ellas?
¿Debería volver a crear la lista de nodos en base a cada pulsación de un botón en dicho cuadro? ¿Hay una forma de hacerlo sólo cuando se pulse intro? eso va bien para líneas nuevas, pero no para editarlas.

Lo único que se me ocurre para hacerlo es que no se pueda escribir en el cuadro de texto, y que haya que pulsar un botón para extraer la línea de texto y editarla en una ventana distinta. Otra sería no usar un cuadro de texto y usar una lista de botones con barra de scroll.

Otra cosa que me atormenta es que cada nodo de la lista debería usar una clase distinta, una almacenaría datos sobre gráficos (FPG, graph, posición...), otra sobre música (canción, repeticiones...) y sólo se crear listas homogeneas, no se crear "punteros" a clases indefinidas, sólo se:

class Nodo {
int valor;
Nodo sig;
}

Nodo nuevo=new Nodo();
nuevo.sig=new Nodo():
etc...
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Noivern

#25
mmm crea la lista de tipo Object y luego debes comprobar de que tipo es el objeto extraido de la lista con el operador instanceof.

if (lista.obtenerObjeto() instanceof TuClase) {
  //logica
}

En la parte de la logica tienes que hacer un casting a TuClase. Mira aqui hay un par de ejemplos.
http://aprendiendojava.blogspot.com/2007/10/operador-instanceof.html

Drumpi

Supongo que te estas refiriendo al uso de las funciones de java.list.*, las cuales no conozco ^^U

Tengo que mirar cómo funciona eso, pero de momento estoy haciéndolo todo "a mano" :P
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Noivern

nooo, me refería a tu propia lista, le inventé el nombre al metodo con el que tu extraes un objeto.
El instanceof es un operador.

Drumpi

Es que no lo entiendo. Vamos a ver, pongo un ejemplo: supongamos que tengo una clase que controla la lista de comandos como la que sigue:

public class ListaComandos {

    class Grafico {
        int x,y,z;
        int file, graph;
        String sComando;
        ??? sig;
    }
   
    class Sonido {
        int numero;
        int repeticiones;
        String sCoamndo;
        ??? sig;
    }
   
    private ??? raiz;
   
    (...)
}


Bien, entonces, dentro de esta clase tengo una serie de métodos que inicializa la lista, añade nodos, borra nodos, etc.
Pero claro, el problema es que el primer nodo puede ser de la clase Grafico, el segundo también de clase Gráfico, pero el tercero puede ser de clase Sonido, y por tanto no puedo poner los punteros raiz y sig como tipos Grafico o Sonido (como venía haciendo hasta ahora, que todos los nodos eran de la misma clase).


¿Es posible que haya entendido por lo poco que he leido que defina raiz como:

private Object raiz;

y de esa forma le pueda asignar cualquier tipo de clase, y luego usar getClass o algo similar para saber de qué tipo es el nodo y poder actuar en consecuencia? (cambiar coordenadas, leer número de repeticiones, etc...).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Rein (K´)ah Al-Ghul

Drumpi deberias usar ArrayList para "coleccionar" la lista que intentas hacer con los punteros (que no existen en java :P )
supongo q habria una super Clase llamada Recurso del cual heredan tanto grafico como sonido, asi q si el arrayList colecciona Recurso...

PD: no te convendria usar la Class Integer en lugar del tipo de dato primitivo int?

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ