Foros del Web » Programación para mayores de 30 ;) » Java »

Printear en orden alfabetico

Estas en el tema de Printear en orden alfabetico en el foro de Java en Foros del Web. Buenas, tengo que printear unos datos que consigo mediante un get pero ordenadamente. El get me los da aleatoriamente, sin ningún criterio(que yo sepa), y ...
  #1 (permalink)  
Antiguo 04/05/2009, 05:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Printear en orden alfabetico

Buenas, tengo que printear unos datos que consigo mediante un get pero ordenadamente. El get me los da aleatoriamente, sin ningún criterio(que yo sepa), y los necesito en orden para luego crear yo un arbol jerarquico.

Los datos que consigo son del tipo:

INBOX.Trash
INBOX.Carpeta1
INBOX.Carpeta2
INBOX
INBOX.Carpeta1.Carpeta11
INBOX.Carpeta2.Carpeta12
INBOX.Carpeta1.Carpeta11.Carpeta111
INBOX.Carpeta3.Carpeta3.Carpeta31
INBOX.Carpeta1.Carpeta21

El '.' separa las subcarpetas. Esto es INBOX es padre de Carpeta1 y Carpeta11 es padre de Carpeta11 y Carpeta21. Así con todos.

Lo que quiero es printearlos ordenados alfabeticamente, bien los padres como los hijos. No se como podría hacerlo, para que lo printara así.

INBOX
INBOX.Carpeta1
INBOX.Carpeta1.Carpeta11
INBOX.Carpeta1.Carpeta11.Carpeta111
INBOX.Carpeta1.Carpeta21
INBOX.Carpeta2
INBOX.Carpeta2.Carpeta12
INBOX.Carpeta3.Carpeta3.Carpeta31
INBOX.Trash


Con sus respectivas tabulaciones.


Este es el codigo que me lo hace aleatorio. No cro que lo necesiteis pero por saberlo.

Cita:
Folder [] listaCarpetas = folder.list("*");
for (int i=0;i<listaCarpetas.length;i++)
{
System.out.println ("Carpeta: " + listaCarpetas[i].getFullName());
}
Gracias a todos!

Última edición por zakabalt; 04/05/2009 a las 06:06
  #2 (permalink)  
Antiguo 04/05/2009, 05:34
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Edito porque he enviado dos veces

Última edición por zakabalt; 04/05/2009 a las 05:35 Razón: He mandado dos veces
  #3 (permalink)  
Antiguo 05/05/2009, 00:56
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Nadie puede echarme una mano?
  #4 (permalink)  
Antiguo 05/05/2009, 04:36
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Wenas

Puedes usar un codigo de ordenacion o usar el metodo sort() http://java.sun.com/j2se/1.4.2/docs/...il/Arrays.html.

Por cierto, el verbo 'printear' no existe.

Saludos.
  #5 (permalink)  
Antiguo 05/05/2009, 08:25
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Me podrías ayudar un poco en como sería en mi código, o como lo harías? Estoy atascado y a ver si consigues ayudarme.

Gracias

PD: Se que printear no existe, por lo que me vale con que me lo muestres en pantalla, jeje
  #6 (permalink)  
Antiguo 05/05/2009, 09:20
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Código:
  public static void main(String[] av) {
  		listado(new File("C:/"));
}
public static void listado (File folder)  
{
	File files[] = folder.listFiles();
	ArrayList lista = new ArrayList();
	for (int i=0;i<files.length;i++) 
	{
		if (files[i].isDirectory()) 
			lista.add(files[i].getName());
	}
	java.util.Collections.sort(lista);
	for (int j=0;j<files.length;j++)
	System.out.println(files[j]);	

}
  #7 (permalink)  
Antiguo 05/05/2009, 09:25
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Perdon. en el segundo for tendras que pintar la lista no el array (estoy un poco dormido)

Código:
	for (int j=0;j<lista.size();j++)
	System.out.println(lista.get(j));
  #8 (permalink)  
Antiguo 06/05/2009, 01:13
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Ya he conseguido ordenarlos, pero no consigo meterle la jerarquia, es decir, una tabulación si tiene padre, dos tabulaciones si tiene padre y su padre también...

Al final he utilizado este código que es basicamente lo que me dijiste, pero he perdido la jerarquia, una cosa que antes tenía, pero al ser un ArrayList no consigo.


Cita:
public static void Ordenado(Folder folder,Store store) throws MessagingException, IOException
{
Folder [] listaCarpetas = folder.list("*");

ArrayList lista = new ArrayList();
for (int i=0;i<listaCarpetas.length;i++)
{

lista.add(listaCarpetas[i].getFullName());
java.util.Collections.sort(lista);
}
for (int j=0;j<lista.size();j++)
System.out.println(lista.get(j)+"\n");
MensajesCarpeta(store);
}
Gracias
  #9 (permalink)  
Antiguo 07/05/2009, 23:14
 
Fecha de Ingreso: mayo-2009
Mensajes: 8
Antigüedad: 15 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Creo que lo que tendrias que hacer primero seria identificar al padre que por lo que veo es el unico elemento que no posee por ejemplo el ´.´(punto) , luego compararias si el resto de elementes poseen ese PADRE y le darias la respectiva tabulacion validando si posenn otro elemento mas..de seguro hay mas cosas y casos que validar pero es una buena idea para iniciar tu funcion generarJerarquia(...)
  #10 (permalink)  
Antiguo 08/05/2009, 00:32
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Printear en orden alfabetico

Si la estructura es tal como la muestras, bastaría tabularlo tantas veces como caracteres '.' tenga el nombre.

S!
PD: Si sabes que 'printear' no existe, entonces mejor no lo uses
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #11 (permalink)  
Antiguo 08/05/2009, 00:58
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Ya conseguí escribir lo que necesitaba, por ejemplo:

Código PHP:
INBOX
         Carpeta1
                Carpeta11
                Carpeta12
                     Carpeta121
         Carpeta2
                Carpeta21
                      Carpeta211
                      Carpeta212
                Carpeta22
          Trash 
Pero ahora necesito una cos más complicada y es que quiero generar un xml con esa jerarquia, por lo que tengo que poner etiquetas y logro poner la etiqueta del principio, pero no la que cierra cada apartado.

Código PHP:
<carpeta>INBOX
    
<sub2>Carpeta1
        
<sub3>Carpeta11
        
<sub2>Carpeta2
            
<sub3>Carpeta21
            
<sub3>Carpeta22
    
<sub2>Drafts
    
<sub2>Sent
    
<sub2>Trash
</carpeta
Tengo esto pero no se que puedo hacer para tener esto:

Código PHP:
<carpeta>INBOX
    
<sub2>Carpeta1
        
<sub3>Carpeta11</sub3>
         </
sub2>    
         <
sub2>Carpeta2
        
<sub3>Carpeta21</sub3>
        <
sub3>Carpeta22>/sub3>
        </
sub2>
    <
sub2>Drafts</sub2>
    <
sub2>Sent</sub2>
    <
sub2>Trash</sub2>
</
carpeta
Para adelante se como crear la etiqueta, pero no se identificar cuando salgo de un grupo para poder cerrarlo.

El código que utilizo es este:

Código PHP:
for (int i=0;i<listaCarpetas.length;i++) 
        {
            
lista.add((listaCarpetas[i].getFullName()));//meter lo que necesito en una lista
            
java.util.Collections.sort(lista);//ordenar la lista
        
}
        
textOut.write("<carpeta>INBOX\n");
        for (
int j=0;j<lista.size();j++)
        {
            
tmp lista.get(j).split("\\.");
            for(
int k=1;k<tmp.length;k++)//hacer las respectivas tabulaciones
                
textOut.write("\t");
            
textOut.write("<sub"+tmp.length+">");
            
textOut.write(tmp[tmp.length-1]);//escribir solo el hijo
            
textOut.write("\n");
        }    
        
textOut.write("</carpeta>"); 
PD: En las etiquetas pone PHP pero es java.

Última edición por zakabalt; 08/05/2009 a las 01:03
  #12 (permalink)  
Antiguo 08/05/2009, 03:36
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Puedes crearte dos variables para saberlo. tmp y tmpant. en cada recorrido del bucle cambias su valor. tmpant por el valor que tenia tmp, y tmp por el siguiente valor.
Cuando sean distintas, habras cambiado de jerarquia de nodo, y por tanto deberas cerrarlo.

Código:
int j=0;
while (j<lista.size())
{
            tmpant = tmp;
            tmp = lista.get(j).split("\\.");
            for(int k=1;k<tmp.length;k++)//hacer las respectivas tabulaciones
                textOut.write("\t");
            if (tmpant.length > 0 && tmp.length != tmpant.length) //si son distintos es que estamos en otro nodo. eltmpant.length>0 sirve para que no entre la primera vez que pasa por el bucle (j=0)
            {
                  textOut.write("</sub"+tmpant.length+">");
            }            
            textOut.write("<sub"+tmp.length+">");
            textOut.write(tmp[tmp.length-1]);//escribir solo el hijo
            textOut.write("\n");
            j++;
        }    
        textOut.write("</carpeta>");
Pd. Lo he hecho con un while, pero daria igual con tu for.

Última edición por elAntonie; 08/05/2009 a las 03:46
  #13 (permalink)  
Antiguo 08/05/2009, 04:53
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Con ese código que has puesto the funciona? Te saca en pantalla las respectivas </sub2>?

A mi con ese código me da nullpointer porque hasta ahi tmp es null y tmpant coje ese valor. Si pongo tmpant=tmp; después de ltmp = lista.get(j).split("\\."); lo que me hace es lo de hasta ahora, sacar todo en pantalla sin los </sub>.

Que me estoy saltando?
  #14 (permalink)  
Antiguo 08/05/2009, 05:19
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Printear en orden alfabetico

Si lo que quieres es generar XML, yo pasaría a utilizar una librería hecha para crearlo. Empiezas haciendo lo simple de abrir y cerrar los tags, ojo a las comillas... y acabas liandote cuando quieres contenido dentro de los tags, escapando los caracteres invalidos XML etc. etc.

JDom, o Dom4J son de las más populares.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #15 (permalink)  
Antiguo 08/05/2009, 05:22
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Ok, ya miraré esas librerías. Pero tu código no funcionaba o hacía algo mal yo? Es que no necesito xml para anda más, solo esta función y si me dices que te ha funcionado me valdría. Si no ha funcionado y no hay sujerencias mirare esas librerías.

Gracias
  #16 (permalink)  
Antiguo 08/05/2009, 05:26
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Cita:
Iniciado por baltuna Ver Mensaje
Ok, ya miraré esas librerías. Pero tu código no funcionaba o hacía algo mal yo? Es que no necesito xml para anda más, solo esta función y si me dices que te ha funcionado me valdría. Si no ha funcionado y no hay sujerencias mirare esas librerías.

Gracias
No la he probado, asi que seguramente tenga fallos, le echare un ojo cuando pueda. De todos modos la idea es esa.

Estoy en el curro colega, me tengo que dedicar a mis cosas.

Si no, siempre puedes mirar las librerias que te ha dicho greeneyed.
  #17 (permalink)  
Antiguo 08/05/2009, 05:30
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Si perdona, no me he fijado y creía que la anterior respuesta también era tuya, por eso te preguntaba de nuevo, pero no hay prisa, sigue con tus cosas, jeje.
  #18 (permalink)  
Antiguo 11/05/2009, 02:48
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Wenas

Código:
public static void listado (File folder)  
{
ArrayList lista = new ArrayList();
lista.add("INBOX");
lista.add("INBOX.Carpeta1");
lista.add("INBOX.Carpeta1.Carpeta11");
lista.add("INBOX.Carpeta1.Carpeta11.Carpeta111");
lista.add("INBOX.Carpeta1.Carpeta21");
lista.add("INBOX.Carpeta2");
lista.add("INBOX.Carpeta2.Carpeta12");
lista.add("INBOX.Carpeta3.Carpeta3.Carpeta31");
lista.add("INBOX.Trash");

String [] tmp = {};
int lengthtmpant = 0;
int lengthtmp = 0;
String textOut = "<carpeta>";
int j=0;
while (j<lista.size())
{
            lengthtmpant = lengthtmp;
            tmp = ((String)lista.get(j)).split("\\.");
            lengthtmp = tmp.length;
            for(int k=1;k<tmp.length;k++)//hacer las respectivas tabulaciones
                textOut += "\t";
	    if (lengthtmpant > 0 && lengthtmp < lengthtmpant)
	    {	
	            while (lengthtmp <= lengthtmpant) //si son distintos es que estamos en otro nodo. eltmpant.length>0 sirve para que no entre la primera vez que pasa por el bucle (j=0)
	            {
	                  textOut += "</sub"+lengthtmpant+">";
	                  lengthtmpant --;
	            }
            }            
            textOut += "<sub"+lengthtmp+">";
            textOut += tmp[lengthtmp-1];//escribir solo el hijo
            textOut += "\n";
            j++;
        }    
        textOut += "</carpeta>";


System.out.println(textOut);
}
Reconoce que no iba tan desencaminado, chato. (Algun while de mas...).
En mi codigo de la clase pepito, la clase que uso para probar cosas asi, inbox lo considera sub1, carpeta1 sub2...
Saludos
  #19 (permalink)  
Antiguo 11/05/2009, 04:52
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Muchas gracias, ya tiene bastante mejor pinta. Todavía no está del todo bien, en tu ejemplo puede que funcione perfecto, pero a mi por ejemplo al teenr más carpetas y subcarpetas me sale así:

Código:
<carpeta>	
	<sub2>Nombre
		<sub3>Apellido
			<sub4>Carpeta1
				<sub5>Carpeta11
				<sub5>Carpeta12
				<sub5>Carpeta13</sub5>
			</sub4>
			<sub4>Carpeta2
				<sub5>Carpeta21</sub5>
			</sub4>
		</sub3>
	</sub2>
	<sub2>Drafts
	<sub2>Nombre2
		<sub3>Apellido2
			<sub4>jj
				<sub5>oo</sub5>
			</sub4>
		</sub3>
	</sub2>
	<sub2>Sent
	<sub2>Trash
</carpeta>
Como ves no cierra las dos primeras </sub5> ni las ultimas </sub2>. Supongo que al tener eso en tu ejemplo te habrá dado bien y no te has fijado en ese detalle. Creo que hace bien los </subX> solo si contiene más subs, si es un sub sin más subs, no los ciera bien.

Las tabulaciones de cierre las he metido yo al escribir, pero bueno lo pongo para que se vea más claro como cierran.

Última edición por zakabalt; 11/05/2009 a las 07:46
  #20 (permalink)  
Antiguo 11/05/2009, 05:59
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Printear en orden alfabetico

Es cierto, vive Dios.

El if No es < es <=

Código:
if (lengthtmpant > 0 && lengthtmp <= lengthtmpant)
Ahi tienes el cambio.

De todos modos, esta muy bien probar, pero no pasa nada por modificar codigo, que no muerde.

Saludos.
  #21 (permalink)  
Antiguo 11/05/2009, 08:05
 
Fecha de Ingreso: mayo-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: Printear en orden alfabetico

Muchas garcias por todo. Ya lo hace bien!

Ahora yo le meto las tabulaciones de vuelta y ya me queda perfecto.

Muchas gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:17.