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é :(
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:
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!
Trabaja con listas en lugar de arrays, así no tienes que controlar el índice. Prueba el siguiente código:
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);
}
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.
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:
ArrayList <String> cities;
ArrayList <String> cities_dest;
Gracias por la ayuda!.
Salu2
Si tienes 1 minuto, edita el título del tema así, para indicar que se ha resuelto la duda:
(http://i.imgur.com/TTS2lLj.png)
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.
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:
(http://i.imgur.com/TTS2lLj.png)
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!