Avatar billede Mikker Praktikant
05. februar 2004 - 13:36 Der er 10 kommentarer og
1 løsning

Sortering af ÆØÅ

Hvordan sorterer man et array korrekt mht. ÆØÅ.

Har forsøgt:

setlocale(LC_ALL, 'da_DK.ISO8859-1');
uasort($myArray, 'strcoll');
Avatar billede jakoba Nybegynder
05. februar 2004 - 14:33 #1
Mwd stort besvær :-))

Alfabetisk sortering er et helvede med tusinder af konventioner og regler. Hvis du spørger på dit lokale bibliotek kan de give dig materiale; plus noget nær enhver biblotekar vil give dig et indtryk af hvor frustrerende det kan være.

"St." betyde "Sankt" i "St. Anne kirke" og skal derfor sorteres som "Sankt Anne Kirke."
"St." betyder "Station" i "Avedøre St." og skal derfor sorteres som "Avedøre Station"

Byen "Århus" staves også ofte "Aarhus" men skal alligevel placeres sammen med "Å" i den alfabetiske rækkefølge (undtagen nogengange hvor den placeres først:).

Og sådan er der et væld af sjove regler (og undtagelser) (og undtagelser til undtagelserne). Det er ikke nemt.

Hvis vi begrænser os til dit aktuelle spørgsmål om blot bogstaverne Æ, Ø og Å, er det nemmesete nok at lave en konstant streng med den 'rigtige' rækkefølge, og så skrive en  compareTo metode der sorterer efter indexOf() på de givne bogstaver i den streng. fx:

Static Final String alfabet = " 0123456789abcdefghijklmnopqrstuvwxyzæøå";
    // du får ret sikkert brug for flere bogstaver i strengen :(

public int compareTo( String otherStr ) {
        // returns:
        //    1  for  this.value > otherStr
        //    0  for  this.value == otherStr
        //  -1  for  this.value < otherStr
    String s1 = this.value.toLowerCase();
    String s2 = otherStr.toLowerCase()
    int minLgt = Math.min( s1.length(), s2.length() );
    int index = 0;
    while ( i < minlgt AND s1.charAt(i) == s2-charAt(i) ) i++;
    if ( i == munLgt ) {
        return ( s1.length() > s2.length())
                    ? 1
                    : (s1.length() == s2.length())
                          ? 0
                          : -1;
    } else {
        return ( alfabet.indexOf( s1.charAt(i) ) > alfabet.indexOf( s2.charAt(i) )
                    ? 1
                    : -1;
    }
}

Og så benytte den metode som ordering relation for dine tekststrenge

mvh JakobA
Avatar billede Slettet bruger
05. februar 2004 - 14:48 #2
JakobA: Det ligner mere javascript?
Avatar billede codebase Praktikant
05. februar 2004 - 14:52 #3
jakobA-->
jeg var lige med på en 'lytter' og havde selv tænkt sådan en løsningsmodel, var bare ikke klar over om der var en smart metode.

Bør man ikke lave en funktion hvor hvert bogstav i ordet valideres.

'Åø' skal jo sorteres før 'Åå', og 'Æ'ord skal jo kommer før dem begge.
et usorteret array
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => c
    [4] => a
    [5] => Øl
    [6] => Æg
    [7] => Åøa
    [8] => Ååa
)
et sorteret array via SORT kommandoen
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => a
    [4] => c
    [5] => Ååa
    [6] => Åøa
    [7] => Æg
    [8] => Øl
)

et sorteret array via en ny SORT funktion
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => a
    [4] => c
    [5] => Æg
    [6] => Øl
    [7] => Åøa
    [8] => Ååa

)

ja, funktionen bør vel kodes i php..
Avatar billede jakoba Nybegynder
05. februar 2004 - 14:59 #4
Ups. du har ret. Det jeg skrev var Java, ikke PHP (men altså heller ikke java script:).
Brug den evt som pseudokode for din sammenligningsfunktion. Det eneste der rigtig er andrledes er at den er skrevet som lokal funktion i en klasse og refererer den klasses data via 'this.value'.  Til php brug skal de være en funktion med 2 parametre:

function compareTo( denEneStreng, denAndenStreng ) {
    ...
}

og den funktion bruger du så sammen med php's usort http://dk.php.net/usort
$sorteretArray = usort( $ikke_sorteretArray, "compareTo" );

mvh JakobA
Avatar billede Mikker Praktikant
05. februar 2004 - 15:02 #5
Jeg kan vel ikke få dig til at oversætte din Java-funktion til PHP?
Avatar billede jakoba Nybegynder
05. februar 2004 - 15:22 #6
$alfabet = " 0123456789abcdefghijklmnopqrstuvwxyzæøå";
    // du får ret sikkert brug for flere bogstaver i strengen :(

function compareTo( $denenestr, $denandenstr ) {
        // returns:
        //    1  for  $denenestr > $denandenstr
        //    0  for  $denenestr == $denandenstr
        //  -1  for  $denenestr < $denandenstr
    $s1 = strtolower($denenestr);
    $s2 = strtolower($denandenstr)
    $minLgt = min( strlen($s1), strlen($s2) );
    for ( $i= 0; i < minlgt; i++ ) {
        if ( $s1{i} != $s2{i} ) break;
            // $streng{$index} er 'NY' notation i PHP. din php version vil måske kræve
            // $streng[$index] ( [] istedetfor {} )
    }
    if ( $i == $minLgt ) {
        return ( strlen($s1) > strlen($s2) )
                    ? 1
                    : ( strlen($s1) == strlen($s2) )
                          ? 0
                          : -1;
    } else {
        return ( strpos( $alfabet, $s1{i} ) > strpos( $alfabet, $s2{i} )
                    ? 1
                    : -1;
    }
}

mvh JakobA
Avatar billede jakoba Nybegynder
05. februar 2004 - 15:26 #7
Bvadr, glemte et ';' og et par '$' tegn

$alfabet = " 0123456789abcdefghijklmnopqrstuvwxyzæøå";
    // du får ret sikkert brug for flere bogstaver i strengen :(

function compareTo( $denenestr, $denandenstr ) {
        // returns:
        //    1  for  $denenestr > $denandenstr
        //    0  for  $denenestr == $denandenstr
        //  -1  for  $denenestr < $denandenstr
    $s1 = strtolower($denenestr);
    $s2 = strtolower($denandenstr);
    $minLgt = min( strlen($s1), strlen($s2) );
    for ( $i= 0; $i < $minlgt; $i++ ) {
        if ( $s1{i} != $s2{i} ) break;
            // $streng{$index} er 'NY' notation i PHP. din php version vil måske kræve
            // $streng[$index] ( [] istedetfor {} )
    }
    if ( $i == $minLgt ) {
        return ( strlen($s1) > strlen($s2) )
                    ? 1
                    : ( strlen($s1) == strlen($s2) )
                          ? 0
                          : -1;
    } else {
        return ( strpos( $alfabet, $s1{i} ) > strpos( $alfabet, $s2{i} )
                    ? 1
                    : -1;
    }
}

med forbehold for flere fejl :(
Avatar billede detox Nybegynder
06. februar 2004 - 10:33 #8
Dette virker fint hos mig:

setlocale (LC_COLLATE, 'dan');
usort ($liste, 'strcoll');
Avatar billede detox Nybegynder
06. februar 2004 - 10:36 #9
Eller for den sags skyld:

setlocale (LC_ALL, 'danish');
uasort ($liste, 'strcoll');
Avatar billede sparki Nybegynder
15. februar 2004 - 16:02 #10
&aelig; = æ
&aling; = å
&oslash: = ø
Avatar billede Mikker Praktikant
28. november 2006 - 11:28 #11
Lukker
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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