# String: jedes Element mit jedem



## saphira (27. Mai 2008)

Hallo,

Ich weiß die Frage ist vielleicht zu trivial, aber ich beiße mir daran irgendwie die Zähne aus.  

Ich habe zwei Objekte wo am ende sowas wie im Beispiel rauskommen soll:

Beispiel:

String str1 = "a,b";
String str2 = "c,d";

Es soll jeder wert mit jedem kombiniert werden (Ausgabe so dann folgendes sein

a,b
a,c
a,d
b,c
b,d
c,d


Ich hoffe ihr versteht was ich meine. 

Gruß Saphira


----------



## SlaterB (27. Mai 2008)

die chars kommen in ein Array und dann brauchst du eine doppelte for-Schleife,
i läuft von 0 bis n-2, j von i+1 bis n-1, die chars für i und j sind dann jeweils ein Paar


----------



## KSG9|sebastian (27. Mai 2008)

** Edit **

Völliger Quatsch, ich hätte die Frage lesen sollen


----------



## SlaterB (27. Mai 2008)

müsste, aber will nicht 

edit: wie auch immer


----------



## saphira (27. Mai 2008)

Hallo,

Danke für die schnelle antwort.
Ich weiß echt nicht mehr, wie das alles geht. 
Habe es versucht, aber scheitere schon zu beginn mit dem Array...

die For-schleifen sollten ungefähr so aussehen, oder?
for(int i=0;i<array1.length-2;i++){
     for(int j=i+1;j<array.length-1;j++); 
};

Gruß,
Saphira


----------



## SlaterB (27. Mai 2008)

char[] array = new char[] {'a','b','c'};

geht natürlich auch mit Strings


----------



## saphira (27. Mai 2008)

Ok, danke, ich werde es gleich nochmal probieren..

Vielen dank SlaterB


----------



## saphira (27. Mai 2008)

Ok, fehler bekomme ich keine, aber wie kann ich das Ergebnis sehen??


----------



## SlaterB (27. Mai 2008)

System.out.println()


----------



## mikachu (27. Mai 2008)

wenn JEDER wert mit JEDEM kombiniert werden soll, und s1="a,b" und s2="c,d" gegeben ist, kommt da nicht folgendes raus?
a,b
a,c
a,d
b,a
b,c
b,d
c,a
c,b
c,d
d,a
d,b
d,c

???


----------



## saphira (27. Mai 2008)

das funktioniert irgendwie nicht richtig, ich bekomme nur eine Buchstaben.
Ich denke mal mein System.out.println() ist falsch:

System.out.println(array1[j]);


----------



## SlaterB (27. Mai 2008)

@mikachu

um das zu verhindern fängt j erst bei i+1 an,
man lernt natürlich mehr wenn man erstmal die komplette Ausgabe baut, richtig,
da habe ich schon viel verraten 


@saphira

> System.out.println(array1[j]);


			
				SlaterB hat gesagt.:
			
		

> die chars für i und j sind dann jeweils ein Paar


nicht nur j, auch i?!


----------



## saphira (27. Mai 2008)

Mikachu hat recht, es soll jedes mit jedem. 
Dieses Beipiel soll mir für eine Spätere Aufgabe als hilfestellung dienen.

@SlaterB
Wie mache ich das, das ich beides ausgebe??


----------



## SlaterB (27. Mai 2008)

System.out.println(das eine + das andere);


----------



## saphira (27. Mai 2008)

das hatte ich ja probiert, aber es funktioniert nicht. Ich bekomme da ne Zahl als Rückgabewert..

System.out.println(array1[j]+array_);_


----------



## SlaterB (27. Mai 2008)

chars werden nunmal teilweise als Zahlen behandelt,
deswegen kannst du ja auch direkt Strings ins Array schreiben

oder mit ein bisschen probieren gehts auch für chars:
System.out.println(array1[j]+", "+array_);_


----------



## KSG9|sebastian (27. Mai 2008)

saphira hat gesagt.:
			
		

> das hatte ich ja probiert, aber es funktioniert nicht. Ich bekomme da ne Zahl als Rückgabewert..
> 
> System.out.println(array1[j]+array_);_


_

versuchs mit

System.out.println(array1[j] + "" + array);_


----------



## saphira (27. Mai 2008)

Das funktioniert, ich erhalte eine paarweise ausgabe! danke dafür

Nur ist das leider noch nicht das gewünschte ergebniss. Ich brauche, wie mikachu geschrieben hat, wirklich jedes mit jedem, egal ob irgendwas dopplet ist. 

Hier mal mein Code:


		for(int i=0;i<array1.length;i++){
			for(int j=0;j<array.length;j++){
				System.out.println(array[j]+","+array1_);
			}
		};_


----------



## mikachu (27. Mai 2008)

wenn es immer nur zwei listen sind:

```
for( int i = 0; i < array1.length; ++i )
{
    for( int j = 0; j < array1.length; ++i )
    {
        // if( i == j ) continue; // keine doppelten
        System.out.println( array1[i] + "," + array1[j] );
    }
    for( int j = 0; j < array.length; ++j )
    {
        System.out.println( array1[i] + "," + array[j] );
    }
}
for( int i = 0; i < array.length; ++i )
{
    for( int j = 0; j < array.length; ++i )
    {
        // if( i == j ) continue; // keine doppelten
        System.out.println( array[i] + "," + array[j] );
    }
    for( int j = 0; j < array1.length; ++j )
    {
        System.out.println( array[i] + "," + array1[j] );
    }
}
```


----------



## SlaterB (27. Mai 2008)

wieso denn jetzt zwei Arrays und 6 Schleifen?

einfach bei einem Array bleiben und die Schleifen-Anfänge (besonders von j) + Enden ändern und evtl. auf Doppelte achten


----------



## saphira (27. Mai 2008)

Danke Mikachu, es funktioniert so wie es soll. Es waren noch 1-2 Fehler drin, aber es läuft jetzt. 

  entschuldige die Frage   
Aber geht das nicht auch irgendwie anders?? Denn bei meinem eigentlichen Problem muß ich sehr viele werte so "bearbeiten" und das dürfte doch sehr langsam sein, oder irre ich mich da?


----------



## KSG9|sebastian (27. Mai 2008)

Slater hat doch geschrieben wie es funktioniert.

Guckst du:


```
public static void main(String[] args) {
		printList(new String[]{"a,b", "c,d"});

	}

	/**
	 *
	 * @param strings - belibige Anzahl an Strings mit Komma-separierten Zeichen
	 *
	 * z.B. Aufruf mit printList(new String[]{"a,b", "c,d"})
	 */
	static void printList(String[] strings){
		// dieser Array enthält alle Zeichen
		String[] all = new String[0];
		int len = 0;
		for(String s : strings){
			// aktuellen String splitten
			String[] actual = s.split(",");
			// Array mit allen Zeichen erweitern
			all = Arrays.copyOf(all, len + actual.length);
			// aktuelle Zeichen in den Gesamtarray kopieren
			System.arraycopy(actual, 0, all, len, actual.length);
			len += actual.length;
		}

		for(int i=0; i<all.length-1; i++){
			for(int j=i+1; j<all.length; j++){
				System.out.println(all[i] + " , " + all[j]);
			}
		}
	}
```


----------



## KSG9|sebastian (27. Mai 2008)

Noch die einfache Variante mit nur zwei Strings


```
static void printTwoStrings(String s1, String s2){
		String[] arr1 = s1.split(",");
		String[] arr2 = s2.split(",");

		String[] all = new String[arr1.length + arr2.length];

		System.arraycopy(arr1, 0, all, 0, arr1.length);
		System.arraycopy(arr2, 0, all, arr1.length, arr2.length);

		for(int i=0; i<all.length-1; i++){
			for(int j=i+1; j<all.length; j++){
				System.out.println(all[i] + " , " + all[j]);
			}
		}
	}
```

Was meinst du mit "viele Strings" und was heißt bearbeiten?
Warum liegen die Daten überhaupt so vor?

Gruß Sebastian


----------



## SlaterB (27. Mai 2008)

naja, ich habe nun endlich auch mal kurz auf das erste Post geschaut und die zwei Teilstrings entdeckt,
dazu habe ich ja bisher noch nix geschrieben, dann sind zwei Array schon ganz gut


----------



## saphira (27. Mai 2008)

Das eigentliche Problem ist sehr komplex. Ich muß eigentlich aus Bildern Features extrahieren, was bereits im Code vorliegt und mittels diesen Werten (Feature) dann die Distanzen zwischen den Bildern berechnen. Und dazu soll ich jedes Bild mit jedem Bild kombinieren um dann die ermittelten Distanzen in einer Datenbank mit den entsprechenden Bildern abzuspeichern.
Und das Beispiel welches ich als Frage reingestellt habe, soll mir eigentlich nur ein Grundgerüst liefern, damit ich mein komplexes Problem später umsetzen kann. Den es geht im endeffekt um Bildsuche...


----------



## mikachu (27. Mai 2008)

saphira hat gesagt.:
			
		

> entschuldige die Frage
> Aber geht das nicht auch irgendwie anders?? Denn bei meinem eigentlichen Problem muß ich sehr viele werte so "bearbeiten" und das dürfte doch sehr langsam sein, oder irre ich mich da?



ich hab auch nicht behauptet, dass das die *ultimative* lösung sei :bae: 
gehen tut das IMMER anders, manchmal auch schneller, aber nie besser :lol:


----------



## saphira (27. Mai 2008)

ok, danke. Vielleicht hat ja jemand ne bessere Idee. Werde dies versuchen irgendwie besser zu machen (wenn das überhaupt geht   

Gruß  Saphira


----------



## mikachu (27. Mai 2008)

naja, mathematisch gesehen greift da ja IMHO die folgende formel:

n... anzahl werte in liste 1
m... anzahl werte in liste 2
x... ergebnismächtigkeit

x = n * n + n * m + m * m
oder, wenn man die doppelten rausfiltern will:
x = n * n - n + n * m + m * m - m

weil: alle werte aus liste1 mit sich selbst verknüpft und alle werte aus liste1 mit liste2 verknüpft und alle werte aus liste2 mit sich selbst verknüpft...


----------



## Leroy42 (27. Mai 2008)

saphira hat gesagt.:
			
		

> String str1 = "a,b";
> String str2 = "c,d";
> 
> Es soll jeder wert mit jedem kombiniert werden (Ausgabe so dann folgendes sein



Aber das ergäbe doch dann:

ac
a,
ad
,c
,,
,d
bc
b,
bd

 ???:L


----------



## SlaterB (27. Mai 2008)

falls das mal ein Moderator liest: sind solche dauerhaften Sinnlos-Spams erwünscht?
 :bloed:


----------



## Leroy42 (28. Mai 2008)

Was ist denn an meinem Post spam?  ???:L 

saphira hat das doch genauso definiert, wie ich ihn
auch dazu zitiert habe.  :shock:


----------



## Leroy42 (28. Mai 2008)

Leroy42 hat gesagt.:
			
		

> Was ist denn an meinem Post spam?  ???:L
> 
> saphira hat das doch genauso definiert, wie ich ihn
> auch dazu zitiert habe.  :shock:



Edit: 


```
for (int i=0; i < str1.length(); ++i)
    for (int j=0; j < str2.length(); ++j)
        System.out.println(str1.charAt(i)+str2.charAt(j));
```


----------

