# Vereinigungen und Schnittmengen von Strings/Arrays



## zooza (4. Jan 2014)

Hallo,

ich bin grade am verzweifeln...

Ich muss für die Uni ein Programm in Java schreiben, welches als Eingabe 3 Mengen bekommt( zB. 
{A,b,3} {a,b,4} {A,C,3})

Und ausgeben soll es folgendes:

Vereinigung der beiden ersten Mengen: {A,b,3,a,4}
Durchschnitt der beiden ersten Mengen: {b}
Vereinigung der drei Mengen: {A,b,3,a,4,C}
Durchschnitt der drei Mengen: {}

Dabei dürfen nur die Methoden der String-Klasse genutzt werden.

Leider fällt mir einfach kein Ansatz an.

Ich habe mir überlegt: Theoretisch müsste man aus der Eingabe 3 Arrays machen und diese dann Zeichen für Zeichen durchgehen und einen neuen Array erschaffen, welcher dann die gewünschten Zeichen enthält. Ist so etwas möglich?

Liebe Grüße


----------



## Gucky (5. Jan 2014)

Sowas ist sogar kein Problem. 
Sind es immer genau neun Werte?


----------



## zooza (5. Jan 2014)

Nein, leider nicht. Die Mengen sind unterschiedlich groß.


----------



## Chloroplast (5. Jan 2014)

dh. du darfst auch nicht nen long nehmen, und den verschieden zeichen positionen zuweisen? weil dann hättest du einfach von den Bits die schittmenge oä. berechnen können


----------



## Gucky (5. Jan 2014)

Du ließt die drei Mengen ein.
Dann splittest du sie um das Leerzeichen (" ") mit der .split() Methode.
Daraus müsste dann ein Array mit drei Einträgen entstehen.
Dann entfernst du die geschweiften Klammern mit einer Schleife und der replaceAll() Methode.
Dann splittest du die drei Einträge um die Kommata und die Arrays speicherst du entweder in einem Array oder in drei Arrays.

Dann führst du deine Operationen aus.


----------



## sindai (5. Jan 2014)

Hey, ich bin Porgrammieranfänger und probier mich gerade an der gleichen Aufgabe. 
Ich krieg aber schon Probleme mit dem Aufsplitten des übergebenen Strings ...


```
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//String set;
		//String test = args[0].toString();
		
	//	String [] set = test.split(" ");
		
		System.out.println(args[0].split(" ").toString());
	//	System.out.println(set[1]);
	//	System.out.println(set[2]);
		
		
	}
```

... gibt Fehler aus.


----------



## Gucky (5. Jan 2014)

Nicht toString. Damit splittest du es und machst es wieder zu einem String. 
Du müsstest das entstehende Array auch in einem solchen speichern.

Gibt Fehlermeldungen aus ist ein bisschen mager. Damit kann ich nichts anfangen.
Aber du hast einen String namens set und dann machst du noch ein Array namens set. Das haut nicht hin.


----------



## sindai (5. Jan 2014)

ok ich machs der Einfachheit halber erstmal mit Strings 


```
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	String menge1 = "2,1,b,x";
	String menge2 = "b,1,2,3,a";
	String menge3 = "0,1,A,3,a";
	//int m1laenge = menge1.length();
	//int m2laenge = menge2.length();
	//int m3laenge = menge3.length();
	
	
	String [] m1 = menge1.split(" "); 
	String [] m2 = menge2.split(" "); 
	String [] m3 = menge3.split(" "); 
	

	System.out.println(Arrays.toString(m1));
	System.out.println(Arrays.toString(m2));
	System.out.println(Arrays.toString(m3));

	}
```

Wie genau operier ich jetzt mit den Arrays? Bspw. für die Vereinigigung der beiden ersten Arrays:
A: 2,1,b,x
B: b,1,2,3,a
Menge: 2, a, b, x, 1, 3

Ich dachte an sowas wie (nicht überprüft) um beide Arrays zusammenzufassen:


```
for( int i = 0, j = m1laenge; i < m2laenge; i++, j++ )
	{
	    m1[j] = m2[i];
	   // System.out.println(Arrays.toString(m1));
	    
	}
```

Aber wie identifizier und entferne ich die doppelten zahlen/buchstaben?

Ich möcht wie der Themenstrater Vereinigung & Durchschnitt von zwei und drei Mengen


----------



## sindai (5. Jan 2014)

Fehlermeldung:
*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at CharSet.main(CharSet.java:52)*

Was mach ich falsch? (mal davon ab dass mein Ansatz wahrscheinlich auch suboptimal ist oder?)


```
import java.util.Arrays;

public class CharSet {

	public static void main(String[] args) {
		
	String menge1 = "2,1,b,x";
	String menge2 = "b,1,2,3,a";
	String menge3 = "0,1,A,3,a";
	int m1laenge = menge1.length();
	int m2laenge = menge2.length();
	int m3laenge = menge3.length();
	
	
	String [] m1 = menge1.split(" "); 
	String [] m2 = menge2.split(" "); 
	String [] m3 = menge3.split(" "); 
	
	String [] vereinigung1 = new String[m1laenge+m2laenge];
	
	
	for (int i = 0; i < m1laenge+m2laenge; i++) {
		vereinigung1[i] = m1[i];
	}
	for (int i = m1laenge, j = 0; i < m1laenge+m2laenge; i++, j++) {
		vereinigung1[i] = m2[j];
	}
	
	System.out.println(Arrays.toString(vereinigung1));
	System.out.println(Arrays.toString(m2));
	System.out.println(Arrays.toString(m3));
	}
	}
```


----------



## Chloroplast (5. Jan 2014)

du gehst in der ersten for-schleife hoch für alle elemente (anzahlElemente1 + anzahlElemente2), auf der rechten weise benutzt du ja aber das array auf der rechten seite, was ja nur azahlElemente1 lang ist. Dann kriegst du natürlich eine ArrayIndexOutOfBounds Exception...


----------



## Gucky (5. Jan 2014)

Außerdem splittest du um ein Zeichen, dass nicht im String vorhanden ist.


----------



## Chloroplast (5. Jan 2014)

und m1laenge ist nicht so lang wie die liste lang ist, sondern zähl die trennzeichen mit. nimm stattdessen m1.length


----------



## sindai (5. Jan 2014)

ehm sry das versteh ich net ganz, inwiefern benutze ich das rechte array bzw. ist dessen Länge relevant?

Ich füge doch dem linken array an position [Ende der vorherigen Schleife] die Werte des rechten arrays zu oder ?

@length
Oh ja stimmt ... aber Eclipse sagt mir ich kann auf ein Array (m1) kein .length() anwenden.


----------



## Gucky (5. Jan 2014)

length beginnt die Zählung bei 1, die Indizes bei 0. Letzter Index=length-1.
length ist keine Methode sondern eine Variable, weswegen du die Klammern weglassen musst.


----------



## Chloroplast (6. Jan 2014)

ich meine diesen teil:

```
for (int i = 0; i < m1laenge+m2laenge; i++) {
        vereinigung1[i] = m1[i];
    }
```
solange i kleiner der länge m1 + länge m2 ist wird hochgezählt und das i. element jewels kopiert. so lang ist m1[] aber garnicht


----------

