# return von mehreren Variablen



## Guest (27. Dez 2006)

Hallo,

ich möchte einer Methode mehrere int-Variablen übergeben und in Abhängigkeit von weiteren übergebenen Parametern wird dann eine dieser int-Variablen um den Wert 1 erhöht. Die Veränderung an der jeweiligen int-Variable wird aber in der Main-Methode nicht berücksichtigt. Wie mach ich das am besten, dass immer nur die in der Methode veränderte Variable über die in der Mainmethode deklarierte gleichnamige Variable drüberkopiert wird? Mit Rückgabewerten?


```
int en=0, er=0, ch=0, te=0, de=0, nd=0, ei=0, ie=0, in=0, es=0; 

kontrolleE(zaehler, zeile, en, er, ei, es);
```


```
public static void kontrolleE(int zaehler, String zeile, int en, int er, int ei, int es)
	{
		if(zaehler < zeile.length() - 1)
		{
			if(zeile.charAt(zaehler + 1) == 'n' || zeile.charAt(zaehler + 1) == 'N')
			{
				en++;
			}
			else if(zeile.charAt(zaehler + 1) == 'r' || zeile.charAt(zaehler + 1) == 'R')
			{
				er++;
			}
			else if(zeile.charAt(zaehler + 1) == 'i' || zeile.charAt(zaehler + 1) == 'I')
			{
				ei++;
			}
			else if(zeile.charAt(zaehler + 1) == 's' || zeile.charAt(zaehler + 1) == 'S')
			{
				es++;
			}
			else if(zeile.charAt(zaehler + 1) == ' ')
			{}
		}
	}
```


----------



## Ark (27. Dez 2006)

Das „Problem“ ist, dass Java Primitive immer by value (d. h. nur ihren Wert) übergibt. Wenn Du den Inhalt ändern willst, musst Du Deine in Objekte (z. B. Arrays) verpacken.

BTW: Ich möchte wetten, dass ich den Code mit einem einzigen, wenn überhaupt(!), if bewerkstelligen kann. 

Ich hoffe, das hilft.

MfG
Ark


----------



## Beni (27. Dez 2006)

Ich würde eine Klasse schreiben, welche all diese Variablen als Objektvariablen besitzt. Die Methode würde ein Objektvariable verändern, und die anderen halt nicht. Dann benötigt die Methode nichtmal einen Rückgabewert.


----------



## mephi (27. Dez 2006)

du meinst ja wrapper klassen oder?


----------



## Ark (27. Dez 2006)

mephi hat gesagt.:
			
		

> du meinst ja wrapper klassen oder?


Die Wrapper in java.lang nützen hier nichts, da sie immutable sind. Ich denke, ein Array wäre hier günstig. (Du kannst natürlich Deine eigene Wrapperklasse bauen, wenn Du willst.)

BTW: Der Code sieht sehr umständlich aus, und ich meine auch, dass er es ist. 

Tipp: Speichere zumindest innerhalb des Blocks nach dem ersten if das zu untersuchende Zeichen mit 
	
	
	
	





```
char c = zeile.charAt(zaehler + 1)|32;
```
 und untersuche das Zeichen folgend nur noch über c. Durch diese ODER-32-Verknüpfung werden alle relevanten Großbuchstaben in Kleinbuchstaben umgewandelt, sodass man nur noch die kleinen Buchstaben zu überprüfen braucht. Beispiel:

```
if(c == 'n') en++;
else if(c == 'r') er++;
```
Dein letzter Test (auf Leerzeichen) ist sowieso sinnlos, da ja nichts passiert. 

Das sei als Skizze mal so dahingestellt. Man kann auch mit switch-case arbeiten, aber meines Erachtens würde das mit Arrays wesentlich eleganter gelöst werden.

Skizze hierzu:

```
private static final char[] CHARMAP = new char[]{'n','r','i','s'};
```

Noch besser wäre natürlich ein regulärer Ausdruck:

```
import java.util.regex.*;

private static final Pattern CHARPAT = Pattern.compile("[nrisNRIS]");
```
Das alles mal zur Anregung. (Es ist für einen Anfänger vllt. etwas schwer zu durchschauen, ich geb's zu. ^^)

MfG
Ark


----------



## Guest (27. Dez 2006)

Ich weiß nicht warum, aber wenn ich z.B. ein 'e' als Buchstaben feststelle und dann den Folgebuchstaben untersuche, stürzt das Programm ab, sowie der "Folgebuchstabe" ein Leerzeichen oder das Ende der zeile ist. Deshalb habe ich

```
if(zaehler < zeile.length() - 1)
```
für das Zeilenende und

```
else if(zeile.charAt(zaehler + 1) == ' ')
{}
```
für den Fall eines Leerzeichens eingebaut.

Ansonsten danke für die vielen Anregungen, ich denke ich guck mir das ganze mal mit Arrays an...


----------



## Ark (27. Dez 2006)

```
private static final char[] CHARMAP = new char[]{'n','r','i','s'};

public static void kontrolleE(int zaehler, String zeile, int[] enris){
	if(zaehler >= zeile.length() - 1) return;
	char c = zeile.charAt(zaehler + 1)|32;
	for(int i=0;i<CHARMAP.length;i++){
		if(c==CHARMAP[i]){
			enris[i]++;
			return;
		}
	}
}
```
Ich hoffe, Du blickst da durch. 

Ark


----------

