Avatar billede vedikkebedre Nybegynder
07. oktober 2004 - 17:27 Der 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.

Håber nogle har en løsning ......

mvh
vedikkebedre
Avatar billede simonvalter Praktikant
07. oktober 2004 - 17:43 #1
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:11 #2
Hvis problemet er store/små bogstaver og danske bogstaver så har jeg lavet
et lille eksempel.
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:11 #3
import java.util.*;

public class Sorting {
    public static void main(String[] args) {
        String[] sa = { "A", "a", "B", "b", "Æ", "æ", "Å", "å",
                        "Aa", "aA", "AA", "aa"};
        System.out.println("sort 1:");
        Arrays.sort(sa);
        for(int i = 0; i < sa.length; i++) {
            System.out.println("  " + sa[i]);
        }
        System.out.println("sort incasesensitive 1:");
        Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER);
        for(int i = 0; i < sa.length; i++) {
            System.out.println("  " + sa[i]);
        }
        System.out.println("sort 2:");
        Arrays.sort(sa, new C1());
        for(int i = 0; i < sa.length; i++) {
            System.out.println("  " + sa[i]);
        }
        System.out.println("sort incasesensitive 2:");
        Arrays.sort(sa, new C2());
        for(int i = 0; i < sa.length; i++) {
            System.out.println("  " + sa[i]);
        }
        System.out.println("sort custom");
        Arrays.sort(sa, new C3());
        for(int i = 0; i < sa.length; i++) {
            System.out.println("  " + sa[i]);
        }
    }
}

class C1 implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((String)o1).compareTo((String)o2);
    }
    public boolean equals(Object obj)  {
        return false;
    }
}

class C2 implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((String)o1).compareToIgnoreCase((String)o2);
    }
    public boolean equals(Object obj)  {
        return false;
    }
}

class C3 implements Comparator {
    private final static String coll = "ABCDEFGHIJKLMOPQRSTUVWXYZÆØÅ";
    private int compare(String s1, String s2, int ix) {
        int v1 = coll.indexOf(Character.toUpperCase(s1.charAt(ix)));
        int v2 = coll.indexOf(Character.toUpperCase(s2.charAt(ix)));
        if(v1 < v2) {
            return -(ix + 1);
        } else if(v1 > v2) {
            return (ix + 1);
        } else {
            if(((ix + 1) < s1.length()) && ((ix + 1) < s2.length())) {
                return compare(s1, s2, ix+1);
            } else {
                return 0;
            }
        }
    }
    public int compare(Object o1, Object o2) {
        return compare((String)o1, (String)o2, 0);
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:11 #4
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
  Æ
  æ
  Å
  å
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:12 #5
private final static String coll = "ABCDEFGHIJKLMOPQRSTUVWXYZÆØÅ";

kan udvides efter behov
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 08:57 #6
Hej simonvalter

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);
??????
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 09:57 #7
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 ????

Nogle forslag??

mvh
vedikkebedre
Avatar billede simonvalter Praktikant
08. oktober 2004 - 10:22 #8
tror nu arnes eksempel gør det samme.

Jeg kan umiddelbart ikke se hvad der skulle være galt så uden at se de data/kode du arbejder med må jeg melde pas.
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 10:35 #9
Hej simonvalter

her er koden:


        dirstr = "C:\";
        fromFolderPath = dirstr;
        toFolderPath = dirstr;

    String fileSeparator = "/";
    String urlToReturn = "";

    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!??????

Håber at du/I kan hjælpe.

mvh
vedikkebedre
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 10:57 #10
Pinligt - men det var min egen fejl.

Problemet lå i logikken der vidste resultaterne (rødmer).

Så hvis Arne_v og simonvalter vil være så venlige at smide et svar begge to, så skal I få nogle fortjente point + en tak for hjælpen.

mvh
vedikkebedre
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 10:59 #11
Pinligt igen igen

Har faktisk kun løst problemet med at der var forskellige resultater.

har stadig problemet(det første) med at det første element har dets moderfolder med i resultatet......????

mvh
vedikkebedre
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 11:10 #12
Koden er jo som følger:

    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);
%>
            <tr>
                <td><%= urlToReturn %> </td><br>
            </tr>

<%
            }   
            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);
        }
    }

Hvor jeg nu har indsat et udskrift for at se hvad der sker.

Og resultatet er at den stopper ved:
/data/vedikkebedre

Men alle de andre virker fint og bliver "renset" korrekt.

Den folder som ikke vises korrekt er oprendelig nr. 4 ud af 5 i mit system.

Nogle forslag????

mvh
vedikkebedre
Avatar billede simonvalter Praktikant
08. oktober 2004 - 11:50 #13
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){

File fromdir = new File(path);
File[] fromdirlist = fromdir.listFiles();
File filename = null;

for (int i = 0; i < fromdir.list().length; i++) {
if(dir){
if (fromdirlist[i].isDirectory()) {
filename = (File) fromdirlist[i];
System.out.println(filename.getName());
}}
else{
if(fromdirlist[i].isFile()){
filename = (File) fromdirlist[i];
System.out.println(filename.getName());
}}

}
}


}

når du laver jsp så bør du holde så meget scriptlet kode ude af dine jsp filer... kom istedet denne kode i en bean som retunerer det du skal bruge.
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 13:13 #14
Hej simonvalter

Du har jo ret - i begge henseender.

Jeg skal "bare" lige have læst op på hvordan man laver det med at lægge koden ud i class-filer og så kalde dem derfra.

simonvalter og arne_v : smid begge et svar og i skal få jeres fortjente point.

mvh
vedikkebedre
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 13:16 #15
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)

mvh
vedikkebedre
Avatar billede arne_v Ekspert
08. oktober 2004 - 13:18 #16
Enterprise Java Beans (EJB) kræver JBoss

Almindelige Java Beans virker fint i Tomcat.
Avatar billede arne_v Ekspert
08. oktober 2004 - 13:18 #17
svar
Avatar billede arne_v Ekspert
08. oktober 2004 - 13:19 #18
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.
Avatar billede arne_v Ekspert
08. oktober 2004 - 13:26 #19
Jeg ved at Lombox plugin (http://www.objectlearn.com/index.jsp) supporterer
både JSP og Tomcat.
Avatar billede simonvalter Praktikant
08. oktober 2004 - 14:09 #20
svar
Avatar billede vedikkebedre Nybegynder
08. oktober 2004 - 14:22 #21
Takker for hjælpen.

Så her er 30 point til hver af jer. i har fortjent dem for hurtig og god rådgivning.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester