Seite 5 von 25 ErsteErste 12345678915 ... LetzteLetzte
Ergebnis 61 bis 75 von 369

Thema: Ein Narr lernt Java

  1. #61
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    PHP-Code:
    public static int wordvalue(String s){
            
    char[] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
            
    int sum=0ls.length();
            
    s.toLowerCase();
            for(
    int k=0k<lk++){
                for(
    int n=0n<26n++){
                    if(
    s.charAt(k) == alphabet[n]){
                        
    sum += n+1;
                        break;
                    }
                }
                
            }
            return 
    sum;
            
        } 
    geht das auch eleganter? gibt die addierten "Buchstabenwerte lt Alphabet" aus, ohne Sonderzeichen zu beachten. Funktioniert auch für Sätze, blanks werden ignoriert. Gefällt mir eigentlich ganz gut, viel besser als 26 Fallunterscheidungen zu machen. Aber ich hätte es gerne noch eleganter, und vor allem würde ich gerne z.B. Scrabble-Werte einstellen. Klar, dafür kann ich einen zweiten Array nehmen, der dann die "Funktionswerte" aufnimmt, aber das ist wieder so unelegant.
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  2. #62
    esst mehr Teile Avatar von mauz
    Registriert seit
    27.11.09
    Beiträge
    20.311
    es gibt ne CharCode Tabelle, ab 65 beginnt das große und ab 97 beginnt das kleine Alphabet; mit CharCodeAt kannste den String abgrasen und wenn du alles im lowerCase machst, dann entweder bei jedem Buchstaben gleich 96 abziehen oder am Ende von der Summe (string.length+1)*96 abziehen.

  3. #63
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Probier mal

    s.charAt(k) - 97

    Bei der Konstanten bin ich mir nicht sicher, aber die Chars sind sortiert

    @Mauz :motz:

  4. #64
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    PHP-Code:
    public static int wordValue(String s) {
            
    int sum 0;
            for (
    char c s.toUpperCase().toCharArray()) { sum += ((int) c) - 0x41; }
            return 
    sum;
        } 
    Sehr viel kompakter gehts nicht. Für Scrabble halt:

    PHP-Code:
    static final SCRABBLEVALUE int[] = {\\TODO};

    public static 
    int wordValue(String s) {
            
    int sum 0;
            for (
    char c s.toUpperCase().toCharArray();) { sum += SCRABBLEVALUE[((int) c) - 0x41]; }
            return 
    sum;
        } 
    Um das Array mit den Buchstabenwerten wirst du nicht drum rum kommen.
    Papoy!

  5. #65
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Wenns um Eleganz geht, könnte er statt zweier Arrays auch eine (Hash/...)Map für die Buchstaben-Punkte-Abbildung nehmen.

  6. #66
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.405
    Bin nicht ganz sicher ob es das ist was Tzu schon gemacht hat, aber:

    Du könntest nen int Array machen und einfach sagen das int[0] = a-wert und int[25] = z-wert; ist.

    Dann machst du eine Funktion: int getValueOfLetter(char l){ return int[l-'a']; }

    Wenn du jetzt ein Wort hast kannst du einfach abfragen welchen Wert der Buchstabe hat indem du getValueOfLetter(buchstabe) eingibst. Das ganze könntest du acuh erweitern auf getValueOfWord(String s)...

    Das Haupt Problem ist es halt die Tabelle mit den Buchstabenwerten anzulegen...

  7. #67
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.405
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Wenns um Eleganz geht, könnte er statt zweier Arrays auch eine (Hash/...)Map für die Buchstaben-Punkte-Abbildung nehmen.
    Geh schlafen

  8. #68
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Zitat Zitat von [VK] Beitrag anzeigen
    [...]Bin nicht ganz sicher ob es das ist was Tzu schon gemacht hat, aber:

    Du könntest nen int Array machen und einfach sagen das int[0] = a-wert und int[25] = z-wert; ist. [...]
    Das ist im Wesentlichen was ich mache mit SCRABBLEVALUE. ((int) 'A') == 0x41 im Übrigen. Ich mache also nichts anderes, als eh schon vorgeschlagen wurde.

    Und eine HashMap ist an der Stelle bääh, weil unnötig. Das ist mit Kanonen auf Spatzen geschossen, wobei das auch daran liegt, dass die HashMap aus dem Util nicht so toll ist.
    Papoy!

  9. #69
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.405
    Zitat Zitat von Tzu Iop Beitrag anzeigen
    Das ist im Wesentlichen was ich mache mit SCRABBLEVALUE. ((int) 'A') == 0x41 im Übrigen. Ich mache also nichts anderes, als eh schon vorgeschlagen wurde.

    Und eine HashMap ist an der Stelle bääh, weil unnötig. Das ist mit Kanonen auf Spatzen geschossen, wobei das auch daran liegt, dass die HashMap aus dem Util nicht so toll ist.

    Nee ich meinte damit das der Buchstabe A zbs 4 Punkte bringt, dann setzt int[0]=4.

    Ist zwar im Grunde eine Hash-Tabelle, aber eine ziemlich einfache ...

  10. #70
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Klar, das ist übertrieben, aber sicher im Sinne des Threadtitels, ein paar andere Datenstrukturen vorzustellen.

  11. #71
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Danke für den Input.

    Die char-Werte direkt auszulesen ist immerhin elegant. Für Scrabblewerte o.ä. mit zwei Arrays zu arbeiten (bzw. nur mit einem, wenn man die charwerte direkt abliest) hatte ich ja auch angedacht. Ne Hashmap scheint mir aber insgesamt genau das zu sein, was ich suche: eine Möglichkeit für diskrete endliche Mengen von Objekten (oder primitiven Datentypen) Funktionen anzugeben, die dann in konstanter Zeit ausgewertet werden. Das ist viel besser als wenn es davon abhängt, der wievielte Funktionswert ausgegeben werden muss
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  12. #72
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Darauf achten, dass Hashmaps nur Objekte nehmen und keine primitiven Datentypen. java.lang kennt aber entsprechende Wrapperklassen. (int -> Integer, char -> Character, usw.)

    edit: Mit Java 7 müsste das aber sogar nur noch für die Deklaration wichtig sein, ansonsten setzt der Compiler implizite Casts.
    Papoy!

  13. #73
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Merci. Ist ja jetzt kein wesentlicher Unterschied für die Funktion, nur muss halt .equals für Vergleiche herhalten.

    Gibts eigentlich nen Unterschied im Speicherverbrauch?
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  14. #74
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Merci. Ist ja jetzt kein wesentlicher Unterschied für die Funktion, nur muss halt .equals für Vergleiche herhalten.

    Gibts eigentlich nen Unterschied im Speicherverbrauch?
    Ja, die Objekte sind größer, weil da mindestens noch ein Pointer aufs Objekt und einer auf den vTable gespeichert werden muss. Außerdem hängt java.lang.Object dann auch noch mit drin. Ka, was das noch beisteuert.

    Aber sowas wie:
    PHP-Code:
    HashMap<CharacterInteger= new HashMap<CharacterInteger>();
    m.put('a'3);
    int a m.get('a'); 
    Sollte gehen, da der char und der int automatisch in ein Objekt verpackt werden bzw. auch wieder ausgepackt werden sollten mit Java 7.
    Papoy!

  15. #75
    Administrator
    Registriert seit
    20.08.04
    Beiträge
    8.964
    Der Speicherverbrauch des Programms mag leicht höher sein. Die unterliegende Datenstruktur bei einer HashMap ist aber auch ein array.
    EDIT: Der Speicherverbrauch ist mindestens doppelt so groß weil neben dem Value in jedem Eintrag auch der key stehen muss. sonst würde man Kollisionen beim Abfragen nicht auflösen können.

    Du benötigst die HashMap aber nicht weil du das Array doch direkt ansprechen kannst. Du hast ja schon die CharCodes. Wenn du weißt, dass du den ersten Buchstaben des Alphabets in der Hand hast, willst du doch nicht mit einer komplizierten Hash-Funktion berechnen an welcher Stelle im Array das Datum liegt.

    a[index] ist doch besser als a[hashfunktion(index)]

    Andererseits ist die Initialisierung der Datenwerte schöner, wenn du dem "e" eine "1" zuweist als wenn du dem fünften Eintrag auf "1" setzt.
    Verstand op nul, frituur op 180.

Seite 5 von 25 ErsteErste 12345678915 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •