yohpopsMedlem sedan feb. 20011 198 inlägg Hej.
Jag har en fråga angående följande kod.
String filearr[][] = new String[1000][5];
FileList fl ;
fl = new FileList(dir, order);
File f;
int o = 0;
long ltemp = 0;
for (Iterator i = fl.iterator();i.hasNext();)
{
// create one line
f = (File) i.next();
filearr[o][0] = f.getName();
ltemp = f.length();
if (!filearr[o][0].substring(filearr[o][0].indexOf(".",0),filearr[o][0].length()).equals(".TXT") && !filearr[o][0].substring(filearr[o][0].indexOf(".",0),filearr[o][0].length()).equals(".txt"))
{
int first = filearr[o][0].indexOf("_",0);
int next = filearr[o][0].indexOf("_",first+1);
int last = filearr[o][0].indexOf("_",next+1);
filearr[o][1] = filearr[o][0].substring(0,first);
filearr[o][2] = filearr[o][0].substring(first+1,next);
filearr[o][3] = filearr[o][0].substring(next+1,last);
filearr[o][4] = ltemp + "";
if (!invno.equals(""))
{
if (invno.equals(filearr[o][1]))
{
binvno=true;
}
else
{
binvno=false;
}
}
if (!custno.equals(""))
{
if (custno.equals(filearr[o][2]))
{
bcustno=true;
}
else
{
bcustno=false;
}
}
if (!dat.equals(""))
{
if (dat.equals(filearr[o][3]))
{
bdat=true;
}
else
{
bdat=false;
}
}
if (binvno && bcustno && bdat)
{
o++;
found = true;
}
}
}
if (found)
{
int reallen = 0;
for (int z=0;z<filearr.length;z++)
{
if (filearr[z][0].equals(null) || filearr[z][0].substring(filearr[z][0].indexOf(".",0),filearr[z][0].length()).equals(".TXT") || filearr[z][0].substring(filearr[z][0].indexOf(".",0),filearr[z][0].length()).equals(".txt"))
{
reallen = z;
break;
}
}
String temp[] = new String[1];
for (int z=0;z<reallen;z++)
{
for (o=0;o<reallen;o++)
{
if (Integer.parseInt(filearr[o][sort]) > Integer.parseInt(filearr[z][sort]))
{
temp = filearr[o];
filearr[o] = filearr[z];
filearr[z] = temp;
}
}
}
for (o=0;o<reallen;o++)
{
if (bgcolor=="")
{
bgcolor="#DDDDDD";
}
else
{
bgcolor="";
}
fileLine = "<tr bgcolor='"+ bgcolor +"'><td onclick=\"openFile('"+ filearr[o][0] +"')\" style=\"cursor:hand;\">" + filearr[o][1] + "</td>" ;
fileLine += "<td onclick=\"openFile('"+ filearr[o][0] +"')\" style=\"cursor:hand;\">" + filearr[o][2] + "</td>" ;
int l_size = Integer.parseInt(filearr[o][4]);
if (l_size>1000)
{
fileLine += "<td onclick=\"openFile('"+ filearr[o][0] +"')\" style=\"cursor:hand;\">" + (l_size/1000) + " kb</td>" ;
}
else
{
fileLine += "<td onclick=\"openFile('"+ filearr[o][0] +"')\" style=\"cursor:hand;\">" + l_size + " b</td>" ;
}
fileLine += "<td onclick=\"openFile('"+ filearr[o][0] +"')\" style=\"cursor:hand;\">" + filearr[o][3] + "</td>" ;
fileLine += "</tr>" ;
out.println(fileLine);
}
}
Koden ska loopa igenom ca: 9000 filer vilket tar totalt 20 min.
Vet ni hur man skulle kunna snabba upp det?
Det går snabbt att bara loopa alla filer men när man börjar bryta isär filnamnet för att kolla att det stämmer så tar det väldigt lång tid.
Funderade på om man skulle kunna läsa in alla filnamn i en textfil och sedan utgå ifrån den när man skapar sökresultatet.
Vad tror ni?
mvh
yohpops
pettssonMedlem sedan jan. 20021 122 inlägg Exakt vad ska koden göra? Lite svårt att veta vad man kan ta bort/göra om utan att veta vad som ska hända...
Vet inte hur mycket detta snabbar upp det hela, men mer lättläst blir det:
//Byt ut
if (!filearr[o][0].substring(filearr[o][0].indexOf(".",0),filearr[o][0].length()).equals(".TXT") && !filearr[o][0].substring(filearr[o][0].indexOf(".",0),filearr[o][0].length()).equals(".txt"))
//Mot
if (!filearr[o][0].substring((filearr[o][0].length() - 4), filearr[o][0].length()).toLowerCase().equals(".txt"))
Detta sparar in lite på radlängden i alla fall ;) Man behöver ju inte använda indexOf, vi vet ju att de fyra sista tecknen ska vara .txt. Och om vi sänker ev. stora bokstäver slipper vi kolla båda. Du kan också göra motsvarande vid det andra användningstillfället.
Tar du några argument? Det finns ju några variabler som inte initerats; invno, dat, custno och boolean-varianterna av dessa... Inte för att det gör nån jätteskillnad, men ändå.
Man kan använda equalsIgnoreCase direkt. Då slipper man göra om alla bokstäver till små tecken, vilket skapar en ny sträng. Bara en liten detalj :)
spangoMedlem sedan juni 20008 205 inlägg Över huvud taget är det en bra idé att låta bli att bygga upp strängar dynamiskt mha String:ar och plusoperatorn. Använd i stället StringBuffer så sparar du på resurserna.
yohpopsMedlem sedan feb. 20011 198 inlägg Ska testa
Tack.
Jag ska testa dessa alternativ.
yohpopsMedlem sedan feb. 20011 198 inlägg Testat
Hej igen.
Jag har testat dessa förslag utan att det gick snabbare.
Om man söker i windows i samma folder så tar det bara några sekunder att hitta filerna.
Vet ni hur man kan använda windows sökfunktion med java?
spangoMedlem sedan juni 20008 205 inlägg Jag måste erkänna att jag inte fattar vad koden är tänkt att göra. Har du lust att förklara kanske jag kan komma med insiktsfulla kommentarer, men just nu orkar jag inte sätta mig in, riktigt...
yohpopsMedlem sedan feb. 20011 198 inlägg koden
Koden loopar igenom filer som har följande syntax.
FakturaNR_KundNR_Datum_KOD.PDF
Man ska kunna söka och sortera på dessa olika delar av filnamnet.
Jag använder substring för att dela upp det
filearr[o][0] = filens path
ltemp = filens storlek
filearr[o][1] = filearr[o][0].substring(0,first);
filearr[o][2] = filearr[o][0].substring(first+1,next);
filearr[o][3] = filearr[o][0].substring(next+1,last);
filearr[o][4] = ltemp + "";
jag tror att det är detta som tar längst tid.
och sen kollar jag om det stämmer med vad man har skickat in.
if (!invno.equals(""))
{
if (invno.equals(filearr[o][1]))
{
binvno=true;
}
else
{
binvno=false;
}
}
......
och om man får träff så sorterar jag resultatet.
String temp[] = new String[1];
for (int z=0;z<reallen;z++)
{
for (o=0;o<reallen;o++)
{
if (Integer.parseInt(filearr[o][sort]) > Integer.parseInt(filearr[z][sort]))
{
temp = filearr[o];
filearr[o] = filearr[z];
filearr[z] = temp;
}
}
}
och sen skrivs det ut en fin lista åt användaren.
yohpopsMedlem sedan feb. 20011 198 inlägg
Jag vet inte.
Kan inte java.
Jag använder FileList
FileList fl ;
fl = new FileList(dir, order);
Vet inte vilken version.
yohpopsMedlem sedan feb. 20011 198 inlägg Vilken klass kan man använda istället?
Är det File?
I så fall
File fl ;
fl = new File(dir);
fl.listFiles(FilenameFilter filter)
??
yohpopsMedlem sedan feb. 20011 198 inlägg Hej igen.
Jag får dessa fel.
Undefined variable: FilenameFilter
FilenameFilter filter=FilenameFilter;
^
Method FilenameFilter() not found in class _fileList_jsp_48
FilenameFilter filter=FilenameFilter();
^
interface java.io.FilenameFilter is an interface. It can't be instantiated.
FilenameFilter filter=new FilenameFilter();
^
och NullPointerException om jag skriver
File fl = new File(dir);
FilenameFilter filter=null;
filter.accept(fl,"*.pdf");
Hur får man FilenameFilter att fungera?
/
yohpops
pettssonMedlem sedan jan. 20021 122 inlägg
yohpops skrev:
Undefined variable: FilenameFilter
FilenameFilter filter=FilenameFilter;
^
Method FilenameFilter() not found in class _fileList_jsp_48
FilenameFilter filter=FilenameFilter();
^
interface java.io.FilenameFilter is an interface. It can't be instantiated.
FilenameFilter filter=new FilenameFilter();
^
Det första felet beror på att du inte har en variabel som heter FilenameFilter, som felmeddelandet indikerar.
Sen försöker du anropa en metod som heter FilenameFilter i din egen klass, men någon sådan har du inte.
Sist så år det som så att FilenameFilter är ett interface, alltså något som andra klasser kan implementera. Ett interface kan inte instansieras, dvs skapas ett objekt av.
Jag hittar inte några standardklasser som implementerar FilenameFilter, så du får nog skriva en egen. Den skulle kunna se ut så här:
class MittFilter implements FilenameFilter
{
public boolean accept(File dir, String name)
{
return (name.endsWith(".den_filändelse_du_vill_söka_efter"));
}
}
Sen kan du instansiera denna klass såhär
public class DinKlass
{
public static void main(String[] args)
{
MittFilter filter = new MittFilter();
File fil = new File("mapp");
File[] filer = fil.listFiles(filter);
}
}
Detta borde fungera, men då jag inte har någon kompilator så lämnar jag inga garantier ;)
yohpopsMedlem sedan feb. 20011 198 inlägg Tack för det.
Ska prova det.
PeWMedlem sedan juni 200010 432 inlägg for (int z=0;z<reallen;z++)
{
for (o=0;o<reallen;o++)
{
if (Integer.parseInt(filearr[o][sort]) > Integer.parseInt(filearr[z][sort]))
{
temp = filearr[o];
filearr[o] = filearr[z];
filearr[z] = temp;
}
}
}
Är den tveklöst mest ineffektiva sorteringsmetoden. Du skulle kunna testa att köra med quicksort (med lite modifikation iom strängar och inte int'ar). Men egentligen är inte det heller en bra lösning och jag tvivlar starkt på att exempelvis windows inbyggda sökfunktioner använder samma taktik som du nu gör (Du jämförde ju själv med windows inbyggda), utan de lär bygga upp det kring regexp'ar istället och de använder ju definitivt inte en Virtual Machine som JVM utan det handlar nog då om en för cpu'n direkt anpassad maskinkod. Men det behöver inte betyda att ditt program är skit för det, utan det var bara en liten kommentar kring din jämförelse med windows sökfunktioner :)
spangoMedlem sedan juni 20008 205 inlägg Eller så använder man någon av varianterna på den inbyggda Arrays.sort som är aningens effektivare än quicksort (i vissa avseenden).
Hmm, En Länkad lista kanske är ett bättre val än en array eller vektor i detta fallet java.util.List
Och kanske är Regular Expressions lite snabbare för att matcha filnamnen ?