tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
512
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    BaseBallBatBoy BaseBallBatBoy ist offline Mitglied Silber
    Registriert seit
    Feb 2007
    Beiträge
    72
    Hi!

    Ich habe ein ArrayList<String>. Die Worte darin möchte ich als Gruppen von Anagrammen zurückgeben.

    Beispiel:
    {"cat", "foo", "bar", "act", "ofo", "race", "care", "acre"}
    returns {{"cat", "act"}, {"bar"}, {"foo", "ofo"}, {"race", "care", "acre"}}

    Meinen Versuch seht ihr unten, aber irgendwo ist noch ein fehler drin....
    Könnt ihr mir da helfen?

    Und übrigens: Ich weiss, dass mein Ansatz nicht der Beste ist. War einfach mal so mein erster Gedanke. Also wenn jemand eine schnellere/schönere/bessere Idee hat: bitte sagen!

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    import java.util.ArrayList;
     
    public class Anagrams {
        public static void main(String[] args) {  
            ArrayList<String> words = new ArrayList<String>(); 
            
            words.add("cat");
            words.add("foo");
            words.add("bar");
            words.add("act");
            words.add("ofo");
            words.add("race");
            words.add("care");
            words.add("acre");
            
            String[][] resultPairs = new String [words.size()][words.size()];
            resultPairs = organizeIntoAnagrams(words);
            
            for (int i=0; i<words.size(); i++) {
                for (int j=0; j<words.size(); j++) {
                    if (!resultPairs[i][j].isEmpty()) {
                        System.out.println("resultPairs[" + i + "][" + j + "]: " + resultPairs[i][j].toString());
                    }
                }
                System.out.println("---------------------------------------------");
            }
        }
        
        // given {"cat", "foo", "bar", "act", "ofo"} returns {{"cat", "act"}, {"bar"}, {"foo", "ofo"}}  
        public static String[][] organizeIntoAnagrams(ArrayList<String> words) {
                
            // take each string and sort it's chars
            ArrayList<String> sortedWords = new ArrayList<String>(); 
            for (int i=0; i<words.size(); i++) {
                sortedWords.add(i, sort(words.get(i)));
            }
            
            // search for anagrams
            String[][] results = new String [words.size()][words.size()];
            for (int i=0; i<words.size(); i++) {
                
                if (!(sortedWords.get(i)).equals(null)) {
                    //safe 1st pair member
                    results[i][0] = words.get(i);
                    
                    int count = 0;
                    
                    for (int j=0; j<words.size(); j++) {
                        if ((sortedWords.get(i)).equals(sortedWords.get(j)) && i != j && !(sortedWords.get(i)).equals(null)) {
                            count++;
                            results[i][count] = words.get(j);
                            
                            // remove matching word from list in order to avoid multiple selects
                            words.set(j, null);
                        }   
                    }
                    words.set(i, null);
                }
            }
            
            return results;
        }
     
        public static String sort(String word) {    
            char[] charArray = word.toCharArray();
            java.util.Arrays.sort(charArray);
            return new String(charArray);
        }
    }
     

  2. #2
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Brokat
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    470
    Mhhh, was genau stimmt denn nicht? Ich meine woran merkst du es? Kommt eine Fehlermeldung? Ein falsches Ergebnis? Wie sieht dies aus?

    Edit: Hier ein Lösungsansatz von mir (ungetestet!, gibt HasMap statt Array zurück)
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    public static HashMap<String,ArrayList<String>> organizeIntoAnagrams(ArrayList<String> words) {
                
            // take each string and sort it's chars
            ArrayList<String> sortedWords = new ArrayList<String>(); 
            for (int i=0; i<words.size(); i++) {
                sortedWords.add(i, sort(words.get(i)));
            }
            
            // search for anagrams
            HashMap<String,ArrayList<String>> results = new HashMap<String,ArrayList<String>>();
            for (int i=0; i<words.size(); i++) {
                if(results.containsKey(sortedWords.get(i)))
            results.get(sortedWords.get(i)).add(words.get(i));    
            else {
            ArrayList<String> al = new ArrayList<String>();
            al.add(words.get(i));
            results.put(sortedWords.get(i),al);
            }
            }
            
            return results;
        }
    Geändert von HonniCilest (10.08.10 um 12:38 Uhr) Grund: Codekorrektur
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  3. #3
    BaseBallBatBoy BaseBallBatBoy ist offline Mitglied Silber
    Registriert seit
    Feb 2007
    Beiträge
    72
    Zitat Zitat von HonniCilest Beitrag anzeigen
    Mhhh, was genau stimmt denn nicht? Ich meine woran merkst du es? Kommt eine Fehlermeldung? Ein falsches Ergebnis? Wie sieht dies aus?
    Entschuldige, der Fehler ist eine NullPointerException:
    resultPairs[0][0]: cat
    resultPairs[0][1]: act
    Exception in thread "main" java.lang.NullPointerException at Anagrams.main(Anagrams.java:37)

    Jedenfalls hat er die erste Gruppe gefunden, aber danach klemmts wohl noch...

    PS: Wenn ich dein Code so anschaue, hat HashMap nicht <Key, Value>? Jedenfalls werde ich's mal mit deinem Vorschlag versuchen.


    PPS: Hier meine Lösung. War natürlich blöd, ich muss ja schauen ob resultPairs nicht null ist und nicht empty. Anyway, jetzt gehts. Wenn aber jemand einen schöneren Vorschlag hat nur sagen! Ich schau mir in der zwischenzeit mal das mit der HashMap an.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    
    import java.util.ArrayList;
     
    public class Anagrams {
        public static void main(String[] args) {  
            ArrayList<String> words = new ArrayList<String>(); 
     
            words.add("cat");
            words.add("foo");
            words.add("bar");
            words.add("act");
            words.add("ofo");
            words.add("race");
            words.add("care");
            words.add("acre");
            
            String[][] resultPairs = new String [words.size()][words.size()];
            resultPairs = organizeIntoAnagrams(words);
            
            for (int i=0; i<words.size(); i++) {
                for (int j=0; j<words.size(); j++) {
                    if (resultPairs[i][j] != null) {
                        System.out.println("resultPairs[" + i + "][" + j + "]: " + resultPairs[i][j].toString());
                    }
                }
            }
        }
        
        
        public static String[][] organizeIntoAnagrams(ArrayList<String> words) {
                
            // take each string and sort it's chars
            ArrayList<String> sortedWords = new ArrayList<String>(); 
            for (int i=0; i<words.size(); i++) {
                sortedWords.add(i, sort(words.get(i)));
            }
            
            // search for anagrams
            String[][] results = new String [words.size()][words.size()];
            for (int i=0; i<words.size(); i++) {
                
                if (words.get(i) != null) {
                    //safe 1st pair member
                    results[i][0] = words.get(i);
                    int count = 0;
                    
                    for (int j=0; j<words.size(); j++) {
                        if ((sortedWords.get(i)).equals(sortedWords.get(j)) && i != j && !(sortedWords.get(i)).equals(null)) {
                            count++;
                            results[i][count] = words.get(j);
                            
                            // remove matching word from list in order to avoid multiple selects
                            words.set(j, null);
                        }   
                    }
                    words.set(i, null);
                }
            }
            return results;
        }
     
        public static String sort(String word) {    
            char[] charArray = word.toCharArray();
            java.util.Arrays.sort(charArray);
            return new String(charArray);
        }
    }
    Geändert von BaseBallBatBoy (09.08.10 um 20:29 Uhr) Grund: Lösung
     

  4. #4
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Brokat
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    470
    Ja stimmt den Key muss man auch noch einen Typ zuweisen.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

Ähnliche Themen

  1. Kindelemente finden
    Von luchs3 im Forum Javascript & Ajax
    Antworten: 11
    Letzter Beitrag: 14.04.09, 14:20
  2. IP Finden?
    Von michi_pc im Forum Smalltalk
    Antworten: 21
    Letzter Beitrag: 07.02.05, 16:39
  3. BhodiNut finden
    Von MaNa im Forum Cinema 4D
    Antworten: 3
    Letzter Beitrag: 05.12.04, 16:19
  4. Programm finden
    Von HUBBLE im Forum Microsoft Windows
    Antworten: 4
    Letzter Beitrag: 02.12.04, 04:29
  5. DNS finden
    Von Bigbutcher im Forum PHP
    Antworten: 3
    Letzter Beitrag: 03.06.03, 17:54