# Buchstaben, die in zwei Wörtern vorkommen



## C.Hermanos (12. Feb 2011)

Hallo,
der Benutzer soll zwei beliege Wörter in der Konsole eingeben.
Die Konsole gibt dann aus, wieviele Buchstaben und welche in beiden Wörtern vorkommen.

Die Ausgabe sollte z.B. so aussehen:



> Eingabe1: Halli
> Eingabe2: Galli
> 
> Ausgabe: 3 Buchstaben sind in beiden Wörtern vorhanden: a,l,i



Ich habe eine Idee wie ich es machen würde bin mir aber nicht so sicher:

For-Schleifen durchlaufen lassen und in den For Schleifen if-Anweisungen, wo die beiden Wörter vergleicht.
Könnt ihr mir Tipps bzw Lösungsvorschläge geben?
Danke


----------



## XHelp (12. Feb 2011)

Du hast die Wörter "Nudelsuppe" und "Pansensalat" aus einem Blatt Papier stehen. Wie würdest du die Aufgabe ohne Computer lösen?


----------



## C.Hermanos (12. Feb 2011)

XHelp hat gesagt.:


> Du hast die Wörter "Nudelsuppe" und "Pansensalat" aus einem Blatt Papier stehen. Wie würdest du die Aufgabe ohne Computer lösen?



Ich würde Buchstabe für Buchstabe durchgehen und schauen ob der jeweilige Buchstabe auch im anderem Wort vorhanden ist.


----------



## XHelp (12. Feb 2011)

Hört sich schon brauchbar an. Genau so musst du es auch umsetzen. Bedenke, dass du doppelte Buchstaben nicht berücksichtigen musst. Dazu lohnt es sich Set in Java anzuschauen.
Du kannst aber auch gleich ein Set für jedes Wort bilden und dann einfach die Schnittmenge ausgeben


----------



## C.Hermanos (12. Feb 2011)

Und wie bilde ich so ein Set für die Wörter??
Sorry aber ich stehe gerade auf dem Schlauch


----------



## XHelp (12. Feb 2011)

The Set Interface (The Java™ Tutorials > Collections > Interfaces)
Du füllst den Set einfach mit den Buchstaben aus dem Wort. Aber falls es dir zu kompliziert ist, dann greif dich auf deine erste Idee zurück.


----------



## nrg (12. Feb 2011)

würd ich so machen:

```
String s = "Dein String";
		Set<Character> set = new HashSet<Character>();
		for (char c : s.toCharArray())
			set.add(c);
```

mit Arrays.asList und dann addAll bzw das HashSet gleich mit dem Collection-Konstruktor instanzieren wird afaik net gehen. Ausser du erstellst manuell ein Character-Array. Da ist mir persönlich das obige lieber.


----------



## eRaaaa (12. Feb 2011)

nrg hat gesagt.:


> mit Arrays.asList und dann addAll bzw das HashSet gleich mit dem Collection-Konstruktor instanzieren wird afaik net gehen.



Außer man benutzt nicht Character sondern Strings mit der Länge 1 *g*


```
Set<String> set = new HashSet<String>(Arrays.asList("Halli".toLowerCase().split("(?<=.)")));
		Set<String> set2 = new HashSet<String>(Arrays.asList("Galli".toLowerCase().split("(?<=.)")));
```

Dann einfach eines der Sets durchlaufen und das andere mit contains prüfen und nen Counter hochzählen 
(würde aber auch bei der ersten Idee bleiben wohl...)


----------



## Raum114 (12. Feb 2011)

Hier noch eine Alternative.

```
public class Main {

    public static void main(String[] args) {
        String a = "Halli";
        String b = "Galli";
        HashSet set = new HashSet();
        Matcher m = Pattern.compile("[" + a + "]", 2).matcher(b);
        for (int i = 0; m.find(i); i = m.end()) {
            set.add(m.group());
        }
        System.out.println(set);
    }
}
```


----------



## nrg (12. Feb 2011)

naja ich denk da gibt's viele Möglichkeiten aber ich würd's primitiv halten. nachdems keine primitiven generics gibt, wenigstens mit wrapper und autoboxing. auf jedenfall würd ich nicht komplett auf generics verzichten, wie in deinem Beispiel


----------



## Landei (13. Feb 2011)

Eine mergesort-artige Lösung ohne Sets:

```
char[] w1 = "Halli".toCharArray();
        char[] w2 = "Galli".toCharArray();
        Arrays.sort(w1);
        Arrays.sort(w2);
        StringBuilder common = new StringBuilder();
        int i1 = 0;
        int i2 = 0;
        while (i1 < w1.length && i2 < w2.length) {
            char c1 = w1[i1];
            char c2 = w2[i2];
            if(c1 == c2) common.append(c1);
            while(c1 <= c2 && i1 < w1.length && w1[i1] == c1) i1++;
            while(c2 <= c1 && i2 < w2.length && w2[i2] == c2) i2++;
        }

        System.out.println(common);
```


----------



## C.Hermanos (13. Feb 2011)

Ersteinmal danke für eure Antworten!
Aber ich habe es wesentlich einfacher hinbekommen als eure Antworten xD


```
import java.util.Scanner;

public class buchstaben{
  public buchstaben(){
  
  Scanner sc = new Scanner(System.in);

  System.out.print("Eingabe1: ");
  String eingabe1 = sc.nextLine();
  
  System.out.print("Eingabe2: ");
  String eingabe2 = sc.nextLine();
  
  int count = 0;

  for (int i = 0;i < eingabe1.length(); i++){
    for(int k = 0;k < eingabe2.length(); k++){


     if(eingabe1.charAt(i) == eingabe2.charAt(k)){

     count++;
     }
    }
   }
  
  System.out.print("Ausgabe: " + count + " Buchstabe(n) sind in beiden Eingaben vorhanden\n");


  }
 public static void main(String [] args){
   new buchstaben();
 }
}
```

Allerdings:
Hier gibt er zurecht 1 aus:
Eingabe1: Hund
Eingabe2: Katze

Aber hier gibt er 6 aus, obwohl er 3 ausgeben sollte:
Eingabe1: Halli
Eingabe2: Galli

Wie mache ich das richtig?


----------



## nrg (13. Feb 2011)

naja du findest eben 4x das l. was meinst du denn, warum wir dir Sets empfehlen?? du kannst jetzt entweder ein Set nehmen oder dir alle gefundenen Buchstaben merken und mit && !contains abprüfen. ahja, du zweckentfremdes da den Sinn eines Konstruktors ganz schön


----------



## Landei (13. Feb 2011)

LOL! Viel einfacher, geht nur nicht... 

<Weisheit>Es gibt zu jedem Problem eine einfache Lösung - und eine korrekte.</Weisheit>


----------

