Ordenar nomes de arquivos que contem numero no final?

8 respostas
quil

Olá pessoal a minha dúvida é a seguinte:

Eu tenho uma pasta cheia de arquivos e o nome deles estão no seguinte formato.:
Msg_0
Msg_1
Msg_2
Msg_3
Msg_4
Msg_5
Msg_6
Msg_7
Msg_8
Msg_9
Msg_10
…E ainda tem mais de 200 arquivos desse tipo seguindo a mesma ordem Msg_(numero)…

O meu problema esta em pegar o nome desses arquivo em ordem ou seja pegar o arquivo Msg_0 depois o Msg_1
e depois Msg_2 e assim por diante.
Mas isso não acontece, porque o programa esta lendo os arquivos em uma ordem de primeira vista parece estranho mas se reparar bem para o programa essa é a ordem certa, aqui o que eu estou falando:
Msg_0
Msg_1
Msg_10
Msg_100
Msg_101
Msg_102
Msg_103
Msg_104
Msg_105
Msg_106
Msg_107
Msg_108
Msg_109
Msg_11
Msg_110
Msg_111
Msg_112
Msg_113
Msg_114
Msg_115
Msg_116
Msg_117
Msg_118
Msg_119
Msg_12
Msg_120
… É dessa forma que o programa esta ordenando os arquivo…

Aqui esta a parte do código que eu estou usando:

import java.io.File;
import java.util.Arrays;

public class FooClasse {

    String[] children;
    File listArquivo;

   
    public void lerArquivo() {

        listArquivo = new File("pasta_Msg");

        children = listArquivo.list();
        Arrays.sort(children);
        System.out.println(Arrays.toString(children));
       
    }//Fim do metodo lerArquivo()
}//Fim da classe FooClasse

Alguém conhece alguma outra forma para poder ordenar esses arquivos?

8 Respostas

A

Basta vc pegar esse exemplo que fiz… e adaptar ao seu modo…

public static void main(String[] args){
    Map<Integer, String> mapArq = new HashMap<>();
    List<Integer> numOrdenado = new ArrayList<>();
    //Sua lista de Arquivos dentro da Pasta por exemplo
    String[] myArray= {"Msg_102", "Msg_1", "Msg_10", "Msg_9", "Msg_101", "Msg_11", "Msg_0", "Msg_3", "Msg_234", "Msg_115", "Msg_20"};             
    for(int i = 0; i < myArray.length; i++){            
        String n = myArray[i].substring(4, myArray[i].length()); //Pega o valor numerico
        mapArq.put(Integer.parseInt(n), myArray[i]); //Chave e Valor
        numOrdenado.add(Integer.parseInt(n));
    }       
    Collections.sort(numOrdenado); 
        for(Integer ord : numOrdenado){    
            if(mapArq.containsKey(ord)){
                System.out.println(mapArq.get(ord)); //Aqui pega seus Arquivos Ordenados
            }        
        }
  }

Saida:
Msg_0
Msg_1
Msg_3
Msg_9
Msg_10
Msg_11
Msg_20
Msg_101
Msg_102
Msg_115
Msg_234

quil

Valeu pela resposta andy11x.

jweibe

Uma solução mais simples e criar um Comparator<T> e passar no método Arrays.sort.

public class FileSort {

	public static void main(String[] args) {
		File dir = new File("/home/user/Files");
		File[] array = dir.listFiles();
		Arrays.sort(array, new ComparatorFile());
		for (File f : array) {
			System.out.println(f);
		}
	}
	
	private static class ComparatorFile implements Comparator&lt;File&gt; {
		@Override
		public int compare(File o1, File o2) {
			Integer n1 = new Integer(o1.getName().split("_")[1]);
			Integer n2 = new Integer(o2.getName().split("_")[1]);
			return n1.compareTo(n2);
		}
	}
}
A
jweibe:
Uma solução mais simples e criar um Comparator<T> e passar no método Arrays.sort.
public class FileSort {

	public static void main(String[] args) {
		File dir = new File("/home/user/Files");
		File[] array = dir.listFiles();
		Arrays.sort(array, new ComparatorFile());
		for (File f : array) {
			System.out.println(f);
		}
	}
	
	private static class ComparatorFile implements Comparator&lt;File&gt; {
		@Override
		public int compare(File o1, File o2) {
			Integer n1 = new Integer(o1.getName().split("_")[1]);
			Integer n2 = new Integer(o2.getName().split("_")[1]);
			return n1.compareTo(n2);
		}
	}
}
Uma Solução bem mais Simples jweibe.. Essa solução também me mostrou outros pontos de vistas.. Obrigado !!!
JavaDreams
andy11x:
Basta vc pegar esse exemplo que fiz.. e adaptar ao seu modo....
public static void main(String[] args){
    Map<Integer, String> mapArq = new HashMap<>();
    List<Integer> numOrdenado = new ArrayList<>();
    //Sua lista de Arquivos dentro da Pasta por exemplo
    String[] myArray= {"Msg_102", "Msg_1", "Msg_10", "Msg_9", "Msg_101", "Msg_11", "Msg_0", "Msg_3", "Msg_234", "Msg_115", "Msg_20"};             
    for(int i = 0; i < myArray.length; i++){            
        String n = myArray[i].substring(4, myArray[i].length()); //Pega o valor numerico
        mapArq.put(Integer.parseInt(n), myArray[i]); //Chave e Valor
        numOrdenado.add(Integer.parseInt(n));
    }       
    Collections.sort(numOrdenado); 
        for(Integer ord : numOrdenado){    
            if(mapArq.containsKey(ord)){
                System.out.println(mapArq.get(ord)); //Aqui pega seus Arquivos Ordenados
            }        
        }
  }
Saida: Msg_0 Msg_1 Msg_3 Msg_9 Msg_10 Msg_11 Msg_20 Msg_101 Msg_102 Msg_115 Msg_234
jweibe:
Uma solução mais simples e criar um Comparator<T> e passar no método Arrays.sort.
public class FileSort {

	public static void main(String[] args) {
		File dir = new File("/home/user/Files");
		File[] array = dir.listFiles();
		Arrays.sort(array, new ComparatorFile());
		for (File f : array) {
			System.out.println(f);
		}
	}
	
	private static class ComparatorFile implements Comparator&lt;File&gt; {
		@Override
		public int compare(File o1, File o2) {
			Integer n1 = new Integer(o1.getName().split("_")[1]);
			Integer n2 = new Integer(o2.getName().split("_")[1]);
			return n1.compareTo(n2);
		}
	}
}

Caras vocês dois são feras...
Uma vez precisei fazer algo do tipo e acabem usando comando do ms-dos pois não sabia o que fazer.

Agora com esses exemplos posso explorar esse lado também...

vou salvar aqui os exemplos e testar mais tarde em casa

thanks

abraço.

regis_hideki

Isso ocorre por que a ordenação padrão de String é a ordem léxica.

quil
jweibe:
Uma solução mais simples e criar um Comparator<T> e passar no método Arrays.sort.
public class FileSort {

	public static void main(String[] args) {
		File dir = new File("/home/user/Files");
		File[] array = dir.listFiles();
		Arrays.sort(array, new ComparatorFile());
		for (File f : array) {
			System.out.println(f);
		}
	}
	
	private static class ComparatorFile implements Comparator&lt;File&gt; {
		@Override
		public int compare(File o1, File o2) {
			Integer n1 = new Integer(o1.getName().split("_")[1]);
			Integer n2 = new Integer(o2.getName().split("_")[1]);
			return n1.compareTo(n2);
		}
	}
}

Valeu pelo exemplo jweibe :)

igrsantos

Muito bom exemplo mesmo, me abriu a mente para o Comparable que quase nunca lembro !

Criado 18 de agosto de 2013
Ultima resposta 19 de ago. de 2013
Respostas 8
Participantes 6