ERLEDIGT
NEIN
NEIN
ANTWORTEN
3
3
ZUGRIFFE
512
512
EMPFEHLEN
-
09.08.10 14:52 #1
- 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); } }
-
09.08.10 16:05 #2
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.
-
09.08.10 20:06 #3
- Registriert seit
- Feb 2007
- Beiträge
- 72
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
-
10.08.10 09:47 #4
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
-
Kindelemente finden
Von luchs3 im Forum Javascript & AjaxAntworten: 11Letzter Beitrag: 14.04.09, 14:20 -
IP Finden?
Von michi_pc im Forum SmalltalkAntworten: 21Letzter Beitrag: 07.02.05, 16:39 -
BhodiNut finden
Von MaNa im Forum Cinema 4DAntworten: 3Letzter Beitrag: 05.12.04, 16:19 -
Programm finden
Von HUBBLE im Forum Microsoft WindowsAntworten: 4Letzter Beitrag: 02.12.04, 04:29 -
DNS finden
Von Bigbutcher im Forum PHPAntworten: 3Letzter Beitrag: 03.06.03, 17:54





Zitieren
Login




