Sortieren File[]

Status
Nicht offen für weitere Antworten.

CK

Aktives Mitglied
Hallo,
habe zur Zeit so eine File[]
Code:
 File[] files = new File(directoryM).listFiles();

Jetzt lese ich z.B. solche diese Files ein:
File1.txt
File2.txt
File10.txt
File15.txt
File7.txt

Jetzt werden diese so sorrtiert:
File1.txt
File10.txt
File15.txt
File2.txt
File7.txt

Jetzt zu meiner Frage.
Wie bekomme ich es hin das diese in dieser Reihenfolge sortiert werden:
File1.txt
File2.txt
File7.txt
File10.txt
File15.txt

Für ein kleines Codebeispiel wäre ich echt dankbar.
 
erstelle dir neue Objekte einer eigenen Klasse,
darin speicherst du das File-Objekt und dazu einen int,
den du per String-Operation und Integer.parseInt aus dem Dateinamen extrahierst:
File15.txt -> 15

dann sortiere eine Liste der erstellten Objekte nach dem int-Wert,
da musst du dich über Comparable schlau machen, falls noch nicht bekannt,

-------

alternativ kannst du aus dem Int auch direkt auf die Position schließen,
z.B. File15.txt -> 15 -> File an Position 15 in eine Liste/ Array schreiben,
am Ende leere Stellen im Array/ in der Liste entfernen, falls die Namen nicht durchgehend sind


------

noch ne Idee: verwende einen Comparator, der erst nach der Länge sortiert, dann alphabetisch
 
Code:
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;

public class FileComparator implements Comparator<File> {

	public int compare(File o1, File o2) {
		String name1 = o1.getName();
		String name2 = o2.getName();
		
		return getInt(name1).compareTo(getInt(name2));
		
	};
	
	private Integer getInt(String name){
		int index = name.lastIndexOf(".");
		if(index == -1)
			return new Integer(0);
		
		StringBuilder sb = new StringBuilder();
		char[] c = name.toCharArray();
		for(int i = index - 1; i >= 0; i--){
			if(Character.isDigit(c[i])){
				sb.insert(0, c[i]);				
			} else {
				return Integer.parseInt(sb.toString());
			}
		}
		
		return new Integer(0);
	}
	
	public static void main(String[] args) {
		File[] f = new File[]{new File("File1.txt"), new File("File10.txt"), new File("File2.txt"), new File("File9.txt")};
		
		Arrays.sort(f, new FileComparator());
		for(File _f : f){
			System.out.println(_f.getName());
		}
	}
	
}
 
Danke, guter Tipp.
Habe das jetzt so gemacht und es klappt.
Code:
 Arrays.sort(files, new Comparator<File>()
                {
                    public int compare(File o1, File o2)
                    {
                        String nurMitZahlen1 = "";
                        String nurMitZahlen2 = "";

                        String name = o1.getName();
                        for (int i = 0; i < name.length(); i++)
                        {
                            if (Character.isDigit(name.charAt(i)))
                            {
                                nurMitZahlen1 +=name.charAt(i);
                            }
                        }

                        name = o2.getName();
                        for (int i = 0; i < name.length(); i++)
                        {
                            if (Character.isDigit(name.charAt(i)))
                            {
                                nurMitZahlen2 += name.charAt(i);
                            }
                        }

                        if(nurMitZahlen1.equals("") || nurMitZahlen2.equals(""))
                        {
                            return 0;
                        }
                            
                        return Integer.parseInt(nurMitZahlen1) - Integer.parseInt(nurMitZahlen2);
                    }

                });
 
Dank, habe es so gemacht und es klappt.
Code:
 Arrays.sort(files, new Comparator<File>()
                {
                    public int compare(File o1, File o2)
                    {
                        String nurMitZahlen1 = "";
                        String nurMitZahlen2 = "";

                        String name = o1.getName();
                        for (int i = 0; i < name.length(); i++)
                        {
                            if (Character.isDigit(name.charAt(i)))
                            {
                                nurMitZahlen1 +=name.charAt(i);
                            }
                        }

                        name = o2.getName();
                        for (int i = 0; i < name.length(); i++)
                        {
                            if (Character.isDigit(name.charAt(i)))
                            {
                                nurMitZahlen2 += name.charAt(i);
                            }
                        }

                        if(nurMitZahlen1.equals("") || nurMitZahlen2.equals(""))
                        {
                            return 0;
                        }
                            
                        return Integer.parseInt(nurMitZahlen1) - Integer.parseInt(nurMitZahlen2);
                    }

                });
 
performant ist das allerdings nicht,
je länger die Liste desto überproportinal mehr Vergleiche musst du ausführen (n log n),
und jeweils derart viele String-Operationen + Parsen..

vergleich dann doch lieber nach Länge + alphabetisch, das ist einfach und sollte auch hinkommen,
sofern die Dateien alle gleich heißen bis auf die Zahl
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben