07. oktober 2004 - 17:27Der er
19 kommentarer og 2 løsninger
Forkert sortering af array
Hejsa
Jeg har et array der er fyldt med fil-navne.
Disse navne kan være alt mulig, og nogle gange starter de med "aa", eller endog "aaa" - når jeg har været mindre opfindsom.
Når jeg nu sortere mit array får jeg ikke listet "a" korrekt??
F.eks. får jeg:
Alle Børge Kurt Misser AAAkisser am_til_k kendt
ect.
Jeg benytter metoden:
Arrays.sort(leftsideFolders, 0, foldercount - 1);
til at sortere med.
Men der er jo hverken hoved eller hale i det resultat jeg får.
Kan det være fordi at der er tomme pladser i arrayet?
Jeg kender jo ikke hvor mange filer og sunfoldere der er i en folder. Så jeg starter med at oprette arrayet[currentfolder..length] - og så fylde det ud jeg nu engang kan.
sort 1: A AA Aa B a aA aa b Å Æ å æ sort incasesensitive 1: A a AA Aa aA aa B b Å å Æ æ sort 2: A AA Aa B a aA aa b Å Æ å æ sort incasesensitive 2: A a AA Aa aA aa B b Å å Æ æ sort custom A a AA Aa aA aa B b Æ æ Å å
Kiggede lidt på dit link, og troede da at man kunne bruge den metode de henviser til -> nemlig: Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Men den fejler på min tomcat-server.
Jeg får følgende fejlbesked:
org.apache.jasper.JasperException at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530) at java.lang.Thread.run(Thread.java:536)
root cause
java.lang.NullPointerException at java.lang.String$CaseInsensitiveComparator.compare(String.java:817) at java.util.Arrays.mergeSort(Arrays.java:1241) at java.util.Arrays.mergeSort(Arrays.java:1249) at java.util.Arrays.mergeSort(Arrays.java:1248) at java.util.Arrays.mergeSort(Arrays.java:1248) at java.util.Arrays.sort(Arrays.java:1188) at org.apache.jsp.flytfiler_jsp._jspService(flytfiler_jsp.java:151) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530) at java.lang.Thread.run(Thread.java:536)
Nogle forslag - da metode unægtelig er smartere end arne_v's som jeg eller takker mange gange for.
mvh vedikkebedre.
P.s. kan nævne at min Eclipse ikke har problemer med at compile med Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); ??????
Lige nu benytter jeg følgende metode som nu virker!?!?? : leftsideFolders = new String[leftsideFoldersLIST.size()]; leftsideFoldersLIST.toArray(leftsideFolders); Arrays.sort(leftsideFolders, String.CASE_INSENSITIVE_ORDER);
Dvs. først lægger jeg alle elementer ned i nogle List's - som jeg så bruger til at smide over i et array.
Men jeg får ikke de samme lister???
Mit udgangspunkt er det samme, men der er forskellige filer i mine arrays afhængig ag om jeg sorterer det eller ej ????
File fromdir = new File(fromFolderPath); File[] fromdirlist = fromdir.listFiles();
for (int i = 0; i < fromdir.list().length; i++) { if (fromdirlist[i].isDirectory()) { urlToReturn = fromdirlist[i].toString(); for(int x = 0; x < urlToReturn.length(); x++) { urlToReturn = urlToReturn.substring(urlToReturn.indexOf(fileSeparator)+1); } leftsideFoldersLIST.add(urlToReturn); }
else if (fromdirlist[i].isFile()) { urlToReturn = fromdirlist[i].toString(); for(int x = 0; x < urlToReturn.length(); x++) { urlToReturn = urlToReturn.substring(urlToReturn.indexOf(fileSeparator)+1); } leftsideFilesLIST.add(urlToReturn); } }
leftsideFolders = new String[leftsideFoldersLIST.size()]; leftsideFoldersLIST.toArray(leftsideFolders); Arrays.sort(leftsideFolders, String.CASE_INSENSITIVE_ORDER);
leftsideFiles = new String[leftsideFilesLIST.size()]; leftsideFilesLIST.toArray(leftsideFiles); Arrays.sort(leftsideFiles, String.CASE_INSENSITIVE_ORDER);
fromdir = new File(toFolderPath); fromdirlist = fromdir.listFiles();
rightsideFolders = new String[fromdirlist.length]; rightsideFiles = new String[fromdirlist.length];
for (int i = 0; i < (fromdir.list()).length; i++) { if (fromdirlist[i].isDirectory()) { urlToReturn = fromdirlist[i].toString();
for(int x = 0; x < urlToReturn.length(); x++) { urlToReturn = urlToReturn.substring(urlToReturn.indexOf(fileSeparator)+1); } rightsideFoldersLIST.add(urlToReturn); } else { urlToReturn = fromdirlist[i].toString(); for(int x = 0; x < urlToReturn.length(); x++) { urlToReturn = urlToReturn.substring(urlToReturn.indexOf(fileSeparator)+1); } rightsideFilesLIST.add(urlToReturn); } }
rightsideFolders = new String[rightsideFoldersLIST.size()]; rightsideFoldersLIST.toArray(rightsideFolders); Arrays.sort(rightsideFolders, String.CASE_INSENSITIVE_ORDER);
rightsideFiles = new String[rightsideFilesLIST.size()]; rightsideFilesLIST.toArray(rightsideFiles); //Arrays.sort(rightsideFiles, String.CASE_INSENSITIVE_ORDER);
"dirstr" er en refenrence på vores unix-server. Men her har jeg blot angivet C-drevet.
Mine problemer er som følger:
Det første element der bliver sad ind i "leftsideFoldersLIST" får tilsyneladende ikke fjernet den sidste "/" i stien - men vil f.eks. være noget med "data/temp" og ikke kun "temp".
Det andet problem er at de 2 arrays - "leftsideFiles" og "rightsideFiles" - er ikke ens. Den eneste forskel jeg kan se, er at det ene er blevet sorteret, og det andet er ikke.
Men "leftsideFiles" indeholder en fil som ikke er i "rightsideFiles" - og ligeledes omvendt!??????
jeg er ret forviret over hvad det egentligt er du prøver at opnå ;)
nu har jeg taget den første del af din kode .. du prøver at liste de mapper/filer der er i en sti, muligvis har jeg misforstået noget men jeg kan ikke se hvorfor du ikke kan bruge file.getName() til at få navnet og slippe for at bruge substring.. du burde iøvrigt bare kunne bruge lastIndexOf hvis det skal være med substring og slippe for at bruge en for løkke.
er det ikke noget ala dette du prøver på?
public class Test{
public static void main(String[] args) { list("/usr/local",false); }
public static void list(String path, boolean dir){
beans er ikke så godt på en Tomcat - den mangler vist beancontainer. Så skal man have JBoss udgaver, så vidt jeg lige husker min ABC på det produkt..!?
Men class-filer må kunne virke.
Hvilke værktøj bruger du egentlig til jsp-udvikling?? Jeg bruger Eclipse - men synes at savne at kunne skrive jsp-filerne direkte i værktøjet. (eller også har jeg bare ikke fundet ud af det endnu - er lige begyndt at bruge det)
Jeg mener bestemt godt at man kan skrive JSP sider i Eclipse. Men jeg er ikke klar over om man kan i out-of-the-box eller om man skal installere en plugin.
Så her er 30 point til hver af jer. i har fortjent dem for hurtig og god rådgivning.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.