# [Programación] Java (cerrado) -> árboles, eficiencia, BB.

## Palmax Maverick

Buenas!

Quiero empezar a programar en java bajo gentoo. He visto que existen 2 IDEs: eclipse y netbeans. Y 4 VM: sun-jdk (he instalado el 1.4.2.0 :Cool: , sun-jre-bin (1.4.2.0 :Cool: , blackdown (1.4.2.01) y kaffe (1.1.4). También tengo instalados jikes y gcj. Quiero escribir programas a Java y luego pasarlo a bytecode y a nativo.

En un primer momento quiero intentar usar software libre, ¿qué puedo hacer?

He instalado eclipse y netbeans y las anteriores VM y tego problemas para lanzar netbeans y eclipse

 *Quote:*   

> $ netbeans
> 
> Error: Unrecognized JVM specific option `-Xverify:none'.
> 
> annotated: sun.net.www.protocol.jar.JarURLConnection - Workaround for JDK #4646668 as part of IZ #21114 failed
> ...

 

 *Quote:*   

> $ java-config -L
> 
> [sun-jdk-1.4.2.08] "Sun JDK 1.4.2.08" (/etc/env.d/java/20sun-jdk-1.4.2.0
> 
> [sun-jre-bin-1.4.2.08] "Sun JRE 1.4.2.08" (/etc/env.d/java/20sun-jre-bin-1.4.2.0
> ...

 [/code]

Un poquito de por favor y ayudadme un poquillo  :Very Happy: 

Gracias

Palmax Maverick

palmax@gmail.comLast edited by Palmax Maverick on Wed Jun 15, 2005 2:32 pm; edited 2 times in total

----------

## psm1984

Yo solo tengo:

java-config -L

[blackdown-jre-1.4.2.01] "Blackdown JRE 1.4.2.01" (/etc/env.d/java/20blackdown-jre-1.4.2.01)

[blackdown-jdk-1.4.2.01] "Blackdown JDK 1.4.2.01" (/etc/env.d/java/20blackdown-jdk-1.4.2.01) *

y va bien, sin ningún problema ni limatación. Como ide uso netbeans.

----------

## Palmax Maverick

1. Entornos de programación existentes

2. VM existentes

3. Compiladores tanto a bytecode como a nativos

4. Classpath's

5. Cosas extra

Mejor con sus licencias, casos de uso y todo eso  :Very Happy: 

THX!

Palmax Maverick

palmax@gmail.com

----------

## ArsDangor

 *Palmax Maverick wrote:*   

> 1. Entornos de programación existentes

 Netbeans, Eclipse... y los de siempre: Vi, Emacs... No he probado Eclipse, pero Netbeans es lento de cojones. *Quote:*   

> 2. VM existentes

 A mí blackdown me ha dado problemas con RMI. Te recomiendo la máquina de Sun. sun-jdk. No es libre, pero sí gratuita. (It's not free, but it's free)  :Razz: 

 *Quote:*   

> 3. Compiladores tanto a bytecode como a nativos

 Para bytecode, javac, que viene con cualquier kit jdk. El de sun puede que sea el mejor.

 *Quote:*   

> 4. Classpath's

 Por lo general, java-config te hará el trabajo.

 *Quote:*   

> 5. Cosas extra

 Dependerá del uso que le quieras dar. ¿Web services? ¿Pruebas automáticas con JUnit y allegados? En cualquier caso, en cuanto te metas con proyectos medio serios necesitarás ant (si no lo tienes ya).

Las licencias y demás... emerge search nombre del paquete.

Salu2.

----------

## ozito

Hola a todos, cuando instalé Gentoo hace unos meses tuve el mismo problema...

Yo tengo instalado las siguientes versiones del JDK de SUN:

.- sun-jdk-1.5.0.03

.- sun-j2sdk1.4.2_08

Suelo trabajar con Eclipse y con JDeveloper de Oracle, y como cada uno necesita una versión distinta del JDK me he creado los siguientes alias en .bashrc:

```

alias eclip="java-config -s sun-jdk-1.5.0.03 && source /home/juan/.gentoo/java && eclipse-3"

alias javad="java-config -s sun-j2sdk1.4.2_08 && source /home/juan/.gentoo/java && /opt/jdev/jdev/bin/jdev"

```

Y sólo tengo que abrir un consola y arrancar el ide que quiera...

----------

## erflako

Hola.

Yo también voy a opinar un poco sobre java.

1. Entorno - uso JBuilder Personal (ahora Foundation) por costumbre. Si tienes ganas de usar Eclipse .. tu mismo , pero yo ya estoy demasiado acostumbrado al Builder. La version Enterprise es de pago, la Personal es gratuita si no la usas con fines lucrativos. Tambien están Forte que ya lo hicieron de pago y le cambiaron el nombre. BEA Weblogic. Depende para que lo quieres. Con gedit se puede programar, claro, pero a ver quien tiene narices de hacer un paquete de 5-6 mil lineas con nano. Hazte con un IDE y ya irás acostumbrandote.

2. VM - la de Sun, aunque conviene tener la Blackdown para tests y cosas así. Ademas la de Blackdown es libre. Lo malo es que tiene una apariencia algo diferente en los componentes gráficos. Será porque no utilizan swing.

3. Compiladores nativos. Ejem, existe javacc, aunque yo no he podido compilar nada hasta ahora. También ant, aunque me cuesta mucho hacerlo funcionar. Si pillas algún producto comersial, normalmente lleva su compilador a nativo. El Builder trae ant, pero en la Enterprise (vete a saber porque - ant es gratuito, pero JBuilder Personal no lo trae).

Extras - ¿que vas  a hacer? Tomcat, beans ... cosas.

----------

## Palmax Maverick

Ejemplo: ¿cómo monto unos árboles AVL en Java?

¿JBuilder? Eso no es solo xa Win2, jejeje estaría bueno que en un foro de Gentoo no hablemos de alguna alternativa a JBuilder.

JEJEEJE

Alguien sabe algo de kaffe? Y que pasa con gcj? Y con gnu-classpath?

----------

## erflako

 *Quote:*   

>  Eso no es solo xa Win2

 

¿Ein? http://www.borland.com/products/downloads/download_jbuilder.html

¿Que le pasa al Builder?

----------

## psm1984

 *Palmax Maverick wrote:*   

> Ejemplo: ¿cómo monto unos árboles AVL en Java?

 

¿a qué te refieres?

----------

## Palmax Maverick

Buenas!

Veamos, todos sabemos que las mejores formas de información son los árboles AVL, B, B+, B*. Yo quiero usar unos AVL, son una clase de árboles que tienen un "alto consumo de CPU" por su forma de equilibrarse, pero "ocupan poco" y la mayoría de sus operaciones son muy sencillas, O(log n).

Todos vosotros sabreis como son pero lo resumo un poco, la principal característica es que de cualquier nodo cuelgan dos árboles que como mucho tienen una altura que difieren en 1. Obviamente, el árbol vacío existe. Esta definición es recursiva. Pero en el fondo los árboles son más sencillos de entender de una forma recursiva, almenos a mi me lo parece.

Me gustaría hacer una clase en Java que diciendole el tipo del nodo (que no se como se hace, soy un n00b en Java), te den los típicos métodos como insertar, eliminar, buscar, inorden, preorden, postorden, ...

Si alguien tiene alguna idea, se lo agradecería.

Ta luego

Palmax Maverick

palmax@gmail.com

----------

## psm1984

La estructura sería:

```

class Arbol {

  private Arbol hi;

  private Arbol hd;

  private Object nodo;

  ...

}

```

----------

## Palmax Maverick

psm1984, si kiero puedo tirarme un AVL, pero no existe uno en el API? o algo así? No puedo tirar de uno hecho? Donde podría conseguirlo?

Mi prácitca no es tirarme unos AVL en Java, sino, que con los procedimientos que dan, me parece algo más sencilla.

Alguna idea?

----------

## Coder

Por desgracia no hay ninguna (o eso creo hasta que se me diga lo contrario) implementación de una estructura de  arbol en el API de Java. Pero bueno, tienes otras estructuras también muy interesantes  :Very Happy: . Echale un vistazo al paquete java.util. 

Por otra lado, siempre puedes buscar en el google "tree class java" y seguro que encontraras alguna implementacion hecha  :Cool: .

Saludos

----------

## psm1984

Lo más parecido es:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeSet.html

o

http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html

----------

## Palmax Maverick

Buenas!

Si miro TreeSet y TreeMap no me sirven de mucho, les falta bastante para ser un AVL. Me parece un poco raro que el lenguaje, que me dijeron que tenia de todo, luego no tenga tanto jejejej

Bueno la verdad es que me esperaba que tuviera los AVL, los B, B+ y B*. Pero bueno, entonces, reconsideraré el hacer la práctica en Java y miraré a C++ que yo he visto implementaciones de AVL en C++.

Es que la cosa es que mi práctica con una implementación de AVL se resuelve muchísimo más fácil que con listas dobles. En caso de duda prefiero pasarme que no llegar. Y por supuesto, recomiendo el empleo de estructura de datos avanzadas: AVL, B, B+ y B*, que aparte de eficiencia reportan funciones _MUY_ útiles.

Si alguien ve algo que me avise.

Gracias

Palmax Maverick

palmax@gmail.com

----------

## sirjuanlu

hola

lo mejor, yo creo que es buscarte un ejemplo en c++, te lo digo porque hoy acabo de enviar mi práctica de árboles rojinegros (red-black tree), que son una variante de los AVL y viendo los ejemplos que encontré en c++, ya demasiado tarde para cambiar toda la implementación, fué como más te enteras. Además tú lo tienes fácil, ya que c++ y java son practicamente idénticos.

1 Saludo

----------

## Palmax Maverick

Nas!

sirjuanlu pasame tu código de rojinegro a mi mail.

Palmax Maverick

palmax@gmail.com

----------

## ArsDangor

 *Palmax Maverick wrote:*   

> Bueno la verdad es que me esperaba que tuviera los AVL, los B, B+ y B*.

 Si lo que quieres es una implementación eficiente de un diccionario, usa Hashmap o HashTable. La reorganización de árboles AVL es muy costosa, y los convierte en "no tan O(log n)".

 *Quote:*   

> Es que la cosa es que mi práctica con una implementación de AVL se resuelve muchísimo más fácil que con listas dobles.

 ¿Porque necesitas un diccionario? Usa hashes. Rápido y sencillo. Y tienes iteradores (o enumeraciones, no lo recuerdo) para el acceso secuencial.

Y recuerda que los algoritmos molones tienen constantes muy altas, y los algoritmos no tan molones tienen constantes muy bajas. A menos que vayas a meter cientos o miles de entradas en el árbol, no tiene sentido que te preocupes por su equilibrado.

Salu2.

----------

## Palmax Maverick

Buenas:

Mi práctica es algo complejo, pero lo elemental es que los nodos del almacen (que tengo que hacer yo, hay 3 más) tienen como campo clave un string, pero esa estructura tiene más campos importantes (y no repetibles por supuesto).

No entiendo muy bien que es un HashMap o HashTable.

Sé que la reorganización de AVL es muy costosa, pero no conocemos el número máximo ni relativo de elementos que pueden poseer.

------------------------------------------------------------------------------

| Nodo1 | Nodo2 | Nodo3 | Nodo 4 | Nodo 5 | Nodo 6 | ... | Nodo N |

------------------------------------------------------------------------------

      |           |           |           |             |            |                 |

      v          v           v          v             v           v                 v

    lista1     lista2    lista3    lista4      lista5        lista6         listaN

Creo que las Tablas Hash eran algo así, pero creo que para que la función hash sea buena habría que saber un poco el tamaño relativo.

Bueno, lo dicho, lo más sencillo es un AVL, sé que no "muy" eficiente por reordenar mucho, pero para todo lo demás sí.

Ta luego

Palmax Maverick

palmax@gmail.com

----------

## ackward

Palmax, 3 cosas antes de nada:

1º) No empieces la casa por el tejado

2º) No dejes que por ver los putos arboles no veas el bosque.

y 3º) Si solo tienes un martillo todo tiene pinta de clavo.

Dejate de arboles y demas y especifica el problema. Cual es el objetivo de la aplicacion y sus requisitios, no el como, el como hay tropecientas mil formas.

Asi de primeras y antes de meterme a cocinar mi propia implementacion de arboles miraba usar una base de datos berkeley, dbm o incluso sqlite. Algunas de ellas se gestionan sus propios arboles de forma mucho mas optimizada que lo que podrias conseguir de forma amateur.

----------

## Palmax Maverick

Buenas!

Vamos a ver, mi programita es un sistema de accesibilidad web y tal. Y la cosa es que quería aprender un poco de árboles "en la práctica" sé que la eficiencia de los AVL por su equilibrio a veces puede ser un poco mala, pero una vez equilibrados son muy buenos.

El objetivo de la aplicación, al ser una práctica, es que aprenda POO (ahora mismo de POO solo conozco ada, que es mi lenguaje materno y favorito a día de hoy).

Acabo de ver los dancing tree, pero no tengo ni idea de que será <- algo de reiser4 y no se qué <- si alguien sabe algo que posteé

Lo de la base de datos berkley, dbm o sqlite creo que pilla un poco gigante jejeje. Aunque sí aprendo a manejar una base de datos estaría chulo.

Bueno ackward si tienes por ahí algo de lo de usar base de datos, suena chulo.

Ta luego

Palmax Maverick

palmax@gmail.com

----------

## ArsDangor

En tal caso, lo que necesitas es un simple diccionario. Algo que te permita insertar claves y buscarlas luego. Lo mejor que puedes usar son los hashes. Tanto por eficiencia (coste O(1) en las operaciones básicas) como por facilidad de uso en Java. 

Si tus claves son Strings (como es más que probable), Java trae por defecto una función hash razonablemente buena (que no tendrás que especificar en ningún sitio). Si son de otro tipo, puedes sobreescribir el método hashCode() de la clase Object. Con eso te ahorras todos los follones de árboles AVLs... Usa Hashtable si quieres mantener juntos los objetos con sus claves. Si quieres tener llamadas del tipo add (clave, objeto), usa HashSet.

Y si el rendimiento de las tablas hash en Java fuera mejorable... al menos no tienes que preocuparte tú por la gestión de colisiones, redimensionado y blablablablabla. El tiempo del programador es mucho más importante que el de la máquina: mejor de copas que chapando.  :Wink: 

Salu2.

----------

## Palmax Maverick

Buenas ArsDangor:

Ok! tu idea parece buena, pero cómo las uso? Donde hay un ejemplo clarificante de ello?

Gracias

Palmax Maverick

palmax@gmail.com

PD: Qué es eso de los dancing trees? <- lo he visto que se usa esta estructura en el fs reiser4

----------

## psm1984

Un ejemplillo de tabla hash:

```

Hashtable tabla = new Hashtable();

UnaClase objeto = new UnaClase();

UnaClase otroObjeto = new UnaClase();

...

//Insertar un objeto

tabla.put(objeto,"LaClave");

...

//Recuperar un objeto

otroObjeto = (UnaClase) tabla.get("LaClave");

```

----------

## Palmax Maverick

Nas!

Vamos a ver, si uso una HashTable, necesito una capacidad máxima (cosa que en mi problema no existe). ¿Qué puedo hacer?

Al final sigo mirando a los AVL  :Very Happy:  JEJEJEJ

Ta luego

Palmax Maverick

palmax@gmail.com

----------

## psm1984

Para usar una tabla hash no necesitas saber el tamaño de los elementos.

----------

## ArsDangor

 *Palmax Maverick wrote:*   

> Nas!
> 
> Vamos a ver, si uso una HashTable, necesito una capacidad máxima

 Java no es C. Es mucho más sencillo. Y no necesitas especificar capacidades ni nada por el estilo. El lenguaje se encarga de todo. Si metes muchos elementos, redimensionará la tabla para que quepan. Si metes pocos elementos, las dejará razonablemente pequeñas.

El ejemplo que te ha puesto psm1984 es todo lo que necesitas saber sobre tablas hash para empezar a usarlas en Java. Tan simple y tan tonto como eso.

No necesitas el tamaño de los elementos: todo son Objects (punteros a ellos, mejor dicho).

----------

## alexlm78

Para programacion en Java aun uso Anjuta, aunque tengo la version comercial de JBuilder X no me gusta, prefiero la vieja escuela de la OOP en texos planos.

----------

## Palmax Maverick

Buenas

Tiene buena pinta entonces!

Ya sabemos que C es un lenguaje ensamblador de alto nivel (como decía un amigo xDDD, que me perdonen ferdy y los de ayer  :Very Happy:  <- Modo coña).

Cada lenguaje está para lo que está, yo siempre he pensado que C era para mini-programas, programas de bajo nivel o programas en los que apremia la eficiencia. Pero hay cosas que se pueden hacer mejor, más fácil o más cómodo en otros lenguajes. Aunque yo siempre he pensado que el código en C es muy poco legible. No sé que pensareis.

Bueno yo creo que mñn dare cerrado este post, que ha sido muy interesante. Sólo por curiosidad lo de usar MySQL y tal como sería?

Gracias

Palmax Maverick

palmax@gmail.com

----------

