# Klammerung testen



## bigchris (23. Nov 2003)

Hallo an alle 

Ich schreibe gerade an einer Klasse, welche mir einen String auf richtge Klammerung untersucht.

Beipiel: Ich habe die Zeichenkette (2*(a+3)+b)*(a-b) hier soll natürlich true zürückgegeben werden, da die Klammern alle richtig sind.

Bei dieser Zeichenkette )2*(a+3)/b( soll false zurückgegeben werden, da die Klammern falsch sind.

Wer kann mir da helfen. Ach ja ich will nicht den Befehl aus der Stringklasse replace benutzen.

Hier mein Code




```
public class Ausdruck {
    public String text;
    
public Ausdruck(String t) {
    
    text = t;
    
}

public boolean istKlammer() {
    
    boolean istRichtigKlammer = true;
    
    String t = text.toUpperCase();
    
    int laenge = t.length();
    
    int position = 0;
    while ((position < laenge / 2) && istRichtigKlammer) {
        
        if (t.charAt(position) != t.charAt(laenge - 1 - position)) {
            
            istRichtigKlammer = false;
      }
      
      position = position + 1;
    }
    
    return istRichtigKlammer;
  }


public String testeKlammer() {
    
    if (!text.equals("")) {
      
for (int laenge = text.length(); laenge > 0; laenge = laenge - 1) {
        
        
        for (int index = 0; index <= text.length() - laenge;
                index = index + 1) {
                  
          
          String klammer = text.substring(index, index + laenge);
          
          if (new Ausdruck(klammer).istKlammer()) {
            return klammer;
          }
          
        }
      }
    }
    
    
    return "";
  }

}
```

Das ist meine Klasse die ich bisher geschrieben habe. Aber irgendwie macht Sie nicht das was Sie soll????

Sie funktioniert nicht so wie ich es will. Wer kann helfen????

bigchris


----------



## mariopetr (23. Nov 2003)

hmm,

also vieleicht hilft es ja, sich zu ueberlegen was genau die richtigen kriterien fuer die korrektheit sind

-anzahl("(")==anzahl(")")
-an jeder belibigen stelle im string gilt anzahl("(")>=anzahl(")")
-zwischen klammerpaaren muessen zeichen stehen "()" ist also ungueltig


```
public class T03
{
	static String[] test=new String[]{
							 "(a*b)+((a-b)+(b-a))",// 		 //$NON-NLS-1$
							 "(a*b)+((a-b)+(b-a)",// 		 //$NON-NLS-1$
							 "a*b)+((a-b)+(b-a))",// 		 //$NON-NLS-1$
							 "(a*b)+((a-b)+(()b-a))"// 		 //$NON-NLS-1$		
	};
	
	public boolean isValid(String input)
	{
		boolean result=true;
		int open=0;
		int close=0;
		
		char[] array=input.toCharArray();
		for (int i= 0; i < array.length; i++)
		{
			if(array[i]==')')
				close++;
			if(array[i]=='(')
				open++;
			if(close>open)
			{
				result=false;
				break;
			}	
		}
		if(result=(open==close));
		{
			Pattern pattern=Pattern.compile("\\(\\)"); // hier kann man noch andere exclusionpatterns eintragen //$NON-NLS-1$
			Matcher matcher=pattern.matcher(input);
			if(matcher.find())
				result=false;
		}
		return result;
	}
	
	public static void main(String[] args)
	{
		T03 t=new T03();
		for (int i= 0; i < test.length; i++)
		{
			System.out.println(test[i]+" is valid="+t.isValid(test[i]));//  //$NON-NLS-1$
		}
	}
}
```


----------



## utnovetur (23. Nov 2003)

Es genügt, die Anzahl der geöffneten Klammern zu zählen.
Bei jeder öffnenden Klammer zählst du eins hoch,
bei jeder schließenden Klammer eins runter und überprüfst noch,
ob die Anzahl dadurch negativ geworden ist (zu viele schließende).
Am Ende muss die Anzahl wieder null sein (sonst zu viele öffnende).


----------



## mariopetr (23. Nov 2003)

nein, das reicht nicht, siehe korrektheit


----------



## bigchris (23. Nov 2003)

Wie kann ich das denn in meinem Code realisieren?

Nichts gegen deinen Code @mariopetr, aber du benutzt einige Befehle, die ich noch nicht hatte und nicht benutzen darf. Wenn ich deinen Code richtig verstehe, dann testest du nur die anzahl der Klammern. Was ist aber mit einem Beispiel )a+b( = false. Bei dir würde aber true rauskommen.




Mann muß doch auch mit meinem Code die Klammer Tests durchführen können oder? Ich weiß einfach nicht wo ich noch modifizieren muß, also abändern??????

Alles was ich benutzen darf steht in meinem Code. Ich glaube Verschachtelung darf ich auch noch nicht benutzen.


bigchris


----------



## martin (24. Nov 2003)

es ist eigentlich doch so leicht zu realisieren, wie
utnovetur es vorgeschlagen hat, da du nur einen 
"typ" klammern (in diesem Fall die "runden) in deinem
ausdruck verwenden möchtest. 
offene klammer: einen hochzählen
geschlossene klammer: einen runterzählen
wenn 0 rauskommt ist alles korrekt, doch dabei
muss man noch beachten, dass der wert nie
negativ werden darf, um dein beispiel ")a+b(" auch
zu berücksichtigen. wenn dies der fall wäre, muss 
sofort abgebrochen werden und false zurückgegeben
werden.


----------



## bigchris (24. Nov 2003)

So die Klammer Test Klasse hab ich jetzt realisiert.

Wie kann ich jetzt noch aus einem Ausdruck die buchstaben zählen.

Ich möchte z.b. aus (a+b)*(a+b) die Anzahl der a haben. Hier wäre das dann 2.

Kann mir da jemand helfen?



```
public class Ausdruck {
    
    public String ausdruck;
    
    public Ausdruck(String a){
        
        ausdruck = a;
    }
    
    
    public boolean istEingeklammert() {
        
        boolean istKorrektEingeklammert = true;
        
        int laenge = ausdruck.length();
        int position;
        int counter = 0;
        
        for (position = 0; position <= (laenge - 1); position++) {
            
            if (ausdruck.charAt(position) == '(') {
                
                counter ++;
            }
            
            if (ausdruck.charAt(position) == ')'){
                
                counter--;
            }
            if (counter < 0){              
                                
                return false;
            }
        }
        if (counter != 0) {
            
            return false;
        }
        
        return true;
    }


// ab hier komme ich nicht mehr weiter

public int anzahlZeichen(char zeichen){

    int counter = 0;
      
    for (int position = 0; position <= (laenge - 1); position++) {
            
            if (ausdruck.charAt(position) == zeichen) {
                
                counter ++;
            }
    }
    
    
}
}
```


----------



## utnovetur (24. Nov 2003)

Das sieht doch gut aus - es fehlt nur noch 

```
return counter;
```


----------



## bigchris (24. Nov 2003)

Was meinst du??

Also das mit dem Abzählen klappt noch nicht. Ich weiß nicht wie ich eine Schleife hinbekomme um aus dem Beispiel: (a+b)*(a+b) die a's zu zählen. Müsste ja 2 rauskommen.

Diese Methode muß noch zusätzlich implementiert werden. Komme aber irgendwie nicht weiter. Das was ich da hingeschrieben habe ist nur ein gedankengang der aber falsch ist.

bigchris


----------



## mariopetr (24. Nov 2003)

wieso falsch. der compiler muesste dier irgend etwas in der art "returnwert fehlt" sagen, was daran liegt das in deiner methode der count nicht mit return zurueckgegeben wird


----------



## bigchris (24. Nov 2003)

Also ich spreche jetzt von dieser Methode


```
public int anzahlZeichen(char zeichen){

    int counter = 0;
    int laenge = ausdruck.length();
    
    for (int position = 0; position <= (laenge - 1); position++) {
            
            if (ausdruck.charAt(position) == zeichen) {
                
                counter ++;
            }
       
} 
return counter;
}
}
```

Diese soll mir ausgeben wie oft das (siehe oben) a in einer Zeichenkette vorkommt. Aber ich glaube das das diese Methode die ich hier angefangen habe nicht tut. Oder liege ich da falsch????

Ich glaube ich bin jetzt total verwirrt.


----------



## bigchris (24. Nov 2003)

Bin ich blöd. Es hat geklappt. Super ich habs mal wieder geschafft. 

bigchris


----------



## BlueSky33 (26. Nov 2006)

Kurze Frage zu dem Thema wenn ich jetzt mit der Methode 


```
public int anzahlZeichen(char zeichen){ 

    int counter = 0; 
    int laenge = ausdruck.length(); 
    
    for (int position = 0; position <= (laenge - 1); position++) { 
            
            if (ausdruck.charAt(position) == zeichen) { 
                
                counter ++; 
            }
```


die Anzahl von einem Zeichen ermittel, also z.B. ich will wissen wie oft das 'a' in Radar vorkommt, sagt er 2 ist ja auch korrekt. Nur wenn ich jetzt wissen will wie oft 'ra' darin vorkommt bringt er mir einen fehler, also ich kann die Methode nur mit einem zeichen ausführen. Was muss ich ändern damit ich auch kleine Zeichenketten wie 'ra' prüfen kann.

Grüße


----------

