[Solucionado] Ordenar elementos de JCombobox

Iniciado por GenR_18, 16 Febrero 2015, 22:34 PM

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

GenR_18

Buen dia foreros.

Resulta que tengo que ordenar los elementos de un JCombobox los cuales los inserto de un archivo de texto, pero cuando hago el sort de Arrays , no los ordena y no sé porqué  :(
Código (java) [Seleccionar]

try
{
FileInputStream archivo = new FileInputStream(path);
DataInputStream entrada = new DataInputStream(archivo);
BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));

String lineas;

while((lineas = buffer.readLine()) != null)
{
StringTokenizer st = new StringTokenizer(lineas,"-",false);

while(st.hasMoreTokens())
{
cities_origen[i] = st.nextToken();
cities_destino[i] = st.nextToken();
//System.out.println(st.nextToken());
i++;
}
}

Arrays.sort(cities_origen);

for(String c:cities_origen)
{
System.out.println(c);
}

/*for(int j=0; j<i; j++)
{
System.out.println(cities_origen[j]);

}*/

entrada.close();

}
catch(Exception file_e)
{
//System.out.println(file_e);
}
}



En cambio, si hago esto:
Código (java) [Seleccionar]


String[] frutas = {"pera","manzana","melon","ciruela"};

Arrays.sort(frutas);

for(String f:frutas)
{
System.out.println(f);
}



Sí funciona, es la misma idea, pero en uno no sirve y en otro sí.
¿Alguien sabe cómo podría arreglar el problema? (ya he googleado y no doy con la solución).

PD: Cuando obtengo los datos del archivo es todo correcto, por lo cual, por ahí no va el problema.
Salu2!

Usuario Invitado

#1
Trabaja con listas en lugar de arrays, así no tienes que controlar el índice. Prueba el siguiente código:

Código (=java) [Seleccionar]
public void fillComboBox(JComboBox cboCities) {

   BufferedReader br = null;
   List<String> cities;

   try {
      br = new BufferedReader(new FileReader("ruta/al/archivo"));
      cities = new ArrayList<>();

      String line;
      while((line=br.readLine())!=null) {
         StringTokenizer tokenizer = new StringTokenizer(line, "-");
         while(tokenizer.hasMoreTokens()) {
            cities.add(tokenizer.nextToken());
         }
      }
      // sort cities list
      Collections.sort(cities);
   }
   catch(FileNotFoundException fnfe){
      fnfe.printStackTrace();
      throw new RuntimeException("Archivo no encontrado");
   }catch(IOException ioe) {
      ioe.printStackTrace();
      throw new RuntimeException("Error en la lectura del archivo");
   }

   // put cities list in combo
   final DefaultComboBoxModel cboModelCities = new DefaultComboBoxModel();
   cboCities.setModel(cboModelCities);
   cboModelCities.addElement(cities);

}
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

GenR_18

Muy bien, muchas gracias! le he hecho algunas modificaciones y me ha funcionado correctamente, les paso el código por si a alguien le sirve.

Código (java) [Seleccionar]

JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(chooser); // chooser o new JFrame()
File fileXML = chooser.getSelectedFile(); // guardamos el archivo en el objeto fileXML
String path = fileXML.getAbsolutePath(); // ubicacion del archivo

try
{
FileInputStream archivo = new FileInputStream(path);
DataInputStream entrada = new DataInputStream(archivo);
BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
cities = new ArrayList<String>();
cities_dest = new ArrayList<String>();

String lineas;

while((lineas = buffer.readLine()) != null)
{
StringTokenizer st = new StringTokenizer(lineas,"-");
//cities = new ArrayList<String>();
//cities_dest = new ArrayList<String>();

while(st.hasMoreTokens())
{
cities.add(st.nextToken());
cities_dest.add(st.nextToken());
i++;
}
}

Collections.sort(cities);
Collections.sort(cities_dest);

entrada.close();

}
catch(FileNotFoundException fnfe){
     fnfe.printStackTrace();
     throw new RuntimeException("Archivo no encontrado");
}
catch(IOException ioe)
{
     ioe.printStackTrace();
     throw new RuntimeException("Error en la lectura del archivo");
}

}


Las declaraciones las puse globales, ya que las ocupo en otras partes del programa:
Código (java) [Seleccionar]

ArrayList <String> cities;
ArrayList <String> cities_dest;


Gracias por la ayuda!.
Salu2

Usuario Invitado

#3
Si tienes 1 minuto, edita el título del tema así, para indicar que se ha resuelto la duda:


Respecto a las variables globales, no existen. Solo hay variables locales, de referencia y de clase. Las variables locales son las que solo viven en un determinado ámbito, como en los métodos. Las variables de referencia son variables que son accesibles a través de instancias de la clase que describe la variable, por último, las variables de clase son variables estáticas a las cuales se accede por el nombre de la clase, seguido del nombre de la variable, como por ejemplo: Math.PI (PI es una variable de clase, es una constante a la cual accedemos directamente por medio de la clase).

Las operaciones debes de hacerlas dentro de un método y allí creas variables que solo van a vivir mientras dure la ejecución del método. Si declaras variables innecesarias como variables de referencia, solo estás mal gastando memoria.

EDIT: Ya vi tu actualización, y está bien que coloques esas variables como de referencia si se van a utilizar en varios procesos.

Un salu2.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

GenR_18

Cita de: Gus Garsaky en 17 Febrero 2015, 00:46 AM
Si tienes 1 minuto, edita el título del tema así, para indicar que se ha resuelto la duda:


Respecto a las variables globales, no existen. Solo hay variables locales, de referencia y de clase. Las variables locales son las que solo viven en un determinado ámbito, como en los métodos. Las variables de referencia son variables que son accesibles a través de instancias de la clase que describe la variable, por último, las variables de clase son variables estáticas a las cuales se accede por el nombre de la clase, seguido del nombre de la variable, como por ejemplo: Math.PI (PI es una variable de clase, es una constante a la cual accedemos directamente por medio de la clase).

Las operaciones debes de hacerlas dentro de un método y allí creas variables que solo van a vivir mientras dure la ejecución del método. Si declaras variables innecesarias como variables de referencia, solo estás mal gastando memoria.

EDIT: Ya vi tu actualización, y está bien que coloques esas variables como de referencia si se van a utilizar en varios procesos.

Un salu2.

Estoy un poquito acostumbrado a otros lenguajes de programación, así que se me van algunos tecnicismos jeje.
De nuevo, gracias por la ayuda.
Salu2!