PDA

View Full Version : [java] ordinamento contenuto cartella


divincodin
16-04-2009, 11:42
Ciao a tutti,ennesimo problema nella realizzazione del mio applicativo :stordita:
Mi permetto di spiegare un pochino il funzionamto altrimenti non si capisce nulla.
In sostanza il mio applicativo fa il grab dei video e salva i frame (ogni 64 crea una cartella nuova).In sostanza quando li salva,non li ordina in maniera corretta,o meglio se li ordina in base alla prima cifra (ordinamento per nome).Infatti quando vado per leggere una di queste directory per caricare le immagini come lista di icone,me le carica in maniera sbagliata.
Vi spiego meglio...x esempio,la prima cartella contiene le foto da 1 a 64 (alle quali dò come nome i numeri stessi, 1.jpg,2.jpg...),ed al posto di sistemarle correttamente,windows le imposta automaticamente così:
1,10,11...19,2,20,21,...29,3,30,31...
Quindi nella lista le carica con questo ordine.
Avevo pensato di dare nomi con 3 cifre...tipo 001,002...ma così penso che l'ordinamento automatico di windows funzioni soltanto fino a 999 frame.
Quindi chiedo se qualcuno sa se magari esiste qualche metodo che mi permetta di accedere alla directory e ordinare le foto in maniera corretta prima di caricarle nella lista.
Grazie anticipatamente per una eventuale risposta.Ciao

PGI-Bis
16-04-2009, 13:20
In tre parole.

Prendi i file dalla cartella:

FileFilter filter = new FileFilter() {
public boolean accept(File f) {
String name = f.getName().toLowerCase();
return name.endsWith(".jpg");
}
};
File[] frames = cartella.listFiles(filter);

e li ordini numericamente:

Comparator<File> comp = new Comparator<File>() {
public int compare(File a, File b) {
String nameA = a.getName();
String nameB = b.getName();
nameA = nameA.substring(0, nameA.indexOf("."));
nameB = nameB.substring(0, nameB.indexOf("."));
int indexA = Integer.parseInt(nameA);
int indexB = Integer.parseInt(nameB);
return indexA == indexB ? 0 : indexA > indexB ? 1 : -1;
}
};
Arrays.sort(frames, comp);

A questo punto i file in frames sono in ordine di numero e non in ordine alfabetico.

Controlla un po' il codice perchè l'ho scritto al volo :D.

divincodin
16-04-2009, 15:24
Ho inserito il codice che dici tu...ma da alcuni errori.
Questa è la parte di codice:

File f[]=dir.listFiles(new ImageFilenameFilter ());

Comparator<File> comp = new Comparator<File>() {
public int compare(File a, File b)
{
String nameA = a.getName();
String nameB = b.getName();
nameA = nameA.substring(0, nameA.indexOf("."));
nameB = nameB.substring(0, nameB.indexOf("."));
int indexA = Integer.parseInt(nameA);
int indexB = Integer.parseInt(nameB);
return indexA == indexB ? 0 : indexA > indexB ? 1 : -1;
}
};
Arrays.sort(f,comp);


E questi sono gli errori:


Applicazione.java:154: '(' or '[' expected
Comparator<File> comp = new Comparator<File>() {
^
Applicazione.java:154: cannot resolve symbol
symbol : variable Comparator
location: class Frame
Comparator<File> comp = new Comparator<File>() {
^
Applicazione.java:154: cannot resolve symbol
symbol : variable File
location: class Frame
Comparator<File> comp = new Comparator<File>() {
^
Applicazione.java:154: cannot resolve symbol
symbol : variable comp
location: class Frame
Comparator<File> comp = new Comparator<File>() {
^
Applicazione.java:166: cannot resolve symbol
symbol : variable comp
location: class Frame
Arrays.sort(f,comp);
^
5 errors



Ma questa sintassi che hai utilizzato nel Comparator,aprendo subito la parentesi "{" e con questi ";" dopo la chiusura di parentesi graffe è nuova?
Io non l'ho mai usata....cosa cambia dal modo che ho sempre usato?

PGI-Bis
16-04-2009, 15:45
Se non vado errato la sintassi che ho usato risale al '97, con l'introduzione di Java 1.1.

Non la definirei nuova, almeno non di zecca :D.

Si chiama istanziazione di classe anonima. In generale:

C x = new C() {}

Equivale a:

class SubC [extends/implements] C {

}
C x = new SubC();


Ho verificato il codice che ho scritto ed è corretto.

Devi importare java.io.File, java.io.FileFilter e java.util.Comparator.

divincodin
16-04-2009, 15:57
Già li avevo importati...non riesco a capire xkè non gli piace sta sintassi!
Il tutto è dentro un try...non penso c'entri nulla,vero?


public void azione(File dir)
{
try
{
//array di file
File f[]=dir.listFiles(new ImageFilenameFilter ());

Comparator<File> comp=new Comparator<File>() {
public int compare(File a, File b)
{
String nameA = a.getName();
String nameB = b.getName();
nameA = nameA.substring(0, nameA.indexOf("."));
nameB = nameB.substring(0, nameB.indexOf("."));
int indexA = Integer.parseInt(nameA);
int indexB = Integer.parseInt(nameB);
return indexA == indexB ? 0 : indexA > indexB ? 1 : -1;
}
};
Arrays.sort(f,comp);



//array di oggetti ImageViewerItem delle dimensioni dell'array precedente
ImageViewerItem [] items = new ImageViewerItem[f.length];
for(int i=0;i<f.length;i++)
{
items[i]=new ImageViewerItem(f[i],-1,100);
}
//Costruisce una ListModel da un array di oggetti e dopo applica il setModel ad essa
ListaIcone.setListData(items);

//prendo il file txt nella cartella corrente
File ArrayTxt[]=dir.listFiles(new TxtFilenameFilter ());
for(int j=0;j<ArrayTxt.length;j++)
{
FileDiTestodir=ArrayTxt[j].getAbsolutePath();
}
BufferedReader input=new BufferedReader(new FileReader(new File(FileDiTestodir)));
String linea=input.readLine();
righe=new ArrayList();
//riempio l' ArrayList
while(linea!=null)
{
righe.add(linea); // aggiunge una linea letta alla lista di String
linea=input.readLine();
}

}

catch (Exception e)
{
System.err.println (e);
}
}

PGI-Bis
16-04-2009, 17:01
forse non gli piacciono i generici. Usi una versione di Java pari o superiore alla 1.5?

divincodin
16-04-2009, 17:10
Veramento uso una versione un pò + datata :D
1.4.1

PGI-Bis
16-04-2009, 17:24
Un'aggiornatina non farebbe male :D.

Comparator comp=new Comparator() {
public int compare(Object filea, Object fileb)
{
File a = (File)filea;
File b = (File)fileb;
String nameA = a.getName();
String nameB = b.getName();
nameA = nameA.substring(0, nameA.indexOf("."));
nameB = nameB.substring(0, nameB.indexOf("."));
int indexA = Integer.parseInt(nameA);
int indexB = Integer.parseInt(nameB);
return indexA == indexB ? 0 : indexA > indexB ? 1 : -1;
}
};

divincodin
16-04-2009, 18:20
Hai ragione,lo dico da tempo che devo farla questa aggiornatina :D
Cmq adesso va...grazie per l'ennesimo aiuto :rolleyes: :)