Avatar billede thinge Nybegynder
04. februar 2003 - 16:12 Der er 6 kommentarer og
1 løsning

Sortering af tekster

HEJ HEJ ALLE
Jeg har 4 Strings: "10a" "9" "11b" "10b"
Disse 4 skal sorteres således at de kommer i nummerorden: "9" "10a" "10b" "11b".
Er der nogen der har en god ide til hvorledes dette kan løses

Thinge
Avatar billede websmith Nybegynder
04. februar 2003 - 16:19 #1
Du kan fx prefixe alle tal under 10 med 0, og alle tal under 100 med 00 osv, så dine tal kommer til at se således ud:
"09a"
"09b"
"10a"
"11b"

På den måde skulle fx en QuickSort gerne kunne sortere dem korrekt.
Avatar billede websmith Nybegynder
04. februar 2003 - 16:20 #2
Eller en hjemmelavet sortering også :)
Avatar billede arne_v Ekspert
04. februar 2003 - 16:22 #3
En "normal" sortering:

import java.util.*;

public class SortEx {
    public static void main(String[] args) {
        String[] sa = { "10a", "9", "11b", "10b"};
        Arrays.sort(sa);
        for(int i = 0; i < sa.length; i++) {
            System.out.println(sa[i]);
        }
    }
}

giver:

10a
10b
11b
9

men det duer ikke ?
Avatar billede arne_v Ekspert
04. februar 2003 - 16:35 #4
Så prøv med:

import java.util.*;

public class SortEx {
    public static void main(String[] args) {
        String[] sa = { "10a", "9", "11b", "10b" };
        Arrays.sort(sa, new CompEx());
        for (int i = 0; i < sa.length; i++) {
            System.out.println(sa[i]);
        }
    }
}

class CompEx implements Comparator {
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        int ix1 = 0;
        while(ix1 < s1.length() && Character.isDigit(s1.charAt(ix1))) ix1++;
        int i1 = Integer.parseInt(s1.substring(0, ix1));
        String sufs1 = s1.substring(ix1);
        String s2 = (String)o2;
        int ix2 = 0;
        while(ix2 < s2.length() &&Character.isDigit(s1.charAt(ix2))) ix2++;
        int i2 = Integer.parseInt(s2.substring(0, ix2));
        String sufs2 = s1.substring(ix2);
        if(i1 == i2) {
            return sufs1.compareTo(sufs2);
        } else {
            return (i1 - i2);
        }
    }
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

}

det giver:

9
10a
10b
11b
Avatar billede jakoba Nybegynder
04. februar 2003 - 16:36 #5
static String cifre = "0123456789";

    // vi skal så læse den numeriske del af strengen og konvertere
    // den til en int
int intFraStr( String val ) {
    int res=0, i=0, mx  = val.length();
    while ( i < mx && cifre.indexOf(val.charAt(0)) >= 0 ) {
        res = res*10 + cifre.indexOf(val.charAt(0));
    }
    return res;
}

    // og en funktion der returnerer 'resten af strengen
String strFraStr( String val ) {
    int i;
    for (i=0; i<val.length(); i++) {
        if ( cifre.indexOf(val.charAt(i)) < 0 ) break;
    }
    return val.substring(0,i);
}

    // nu kan du lave en 'sammenlign 2 værdier' funktion
int compare( String val1, String val2 )
    if ( intFraStr(val1) == intFraStr(val2) ) {
        if ( strFraStr(val1) == strFraStr(val2) ) return 0;
        if ( strFraStr(val1) > strFraStr(val2) ) return 1;
        return -1;
    } else {
        if ( intFraStr(val1) > intFraStr(val2) ) return 1;
        return -1;
    }
}

og så ellers sortere med en bubblesort eller hvad du nu kender

mvh JakobA
Avatar billede arne_v Ekspert
04. februar 2003 - 16:45 #6
Jakob>

Du kunne simplificere din kode lidt ved at bruge
Integer parseInt of Character isDigit.
Avatar billede thinge Nybegynder
06. februar 2003 - 13:20 #7
Jeg har brugt din arne v
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