# Spezielle Array-Abfrage



## Chasor (2. Feb 2010)

Angelehnt an folgenden Thread habe ich eine speziellere Frage:
http://www.java-forum.org/java-basics-anfaenger-themen/95619-string-datei-unterteilen.html

Angenommen ich nehme die Matrixzeile "011201011".
Diese werden in ein Array "char[] matrixarray" gespeichert, also matrixarray[0] = 0; matrixarray[1] = 1 usw.

Nun muss ich herausfinden, wieviele 1er - Blöcke in dem Array drin stecken. In meinem Beispiel sind es 3 Stück (vorne 11; mitte 1; hinten 11). Ich habe bereits versucht, die im Array gespeicherten Werte miteinander zu vergleichen, und wenn immer ein Arrayfeld mit dem darauffolgenden Subtrahiert 1 oder -1 ergibt, soll ein weiteres Array "matrixzeile" mit der Anzahl der Blöcke gefüllt werden.
Also matrixzahl[0] = 3 usw.

Wie genau lässt sich das am besten verwirklichen?


----------



## SlaterB (2. Feb 2010)

Chasor hat gesagt.:


> Wie genau lässt sich das am besten verwirklichen?


z.B.


Chasor hat gesagt.:


> Ich habe bereits versucht, die im Array gespeicherten Werte miteinander zu vergleichen, und wenn immer ein Arrayfeld mit dem darauffolgenden Subtrahiert 1 oder -1 ergibt, soll ein weiteres Array "matrixzeile" mit der Anzahl der Blöcke gefüllt werden.


'versuchen' durch 'umsetzen' ersetzen,
bei Fragen/ Problemen kleines Testprogramm mit aktuellen Code posten


----------



## Michael... (2. Feb 2010)

man könnte einfach durch das Array iterieren und jedes Mal wenn man auf eine 1 stösst überprüfen, ob der Vorgänger auch eine 1 ist. Wenn nicht befindet man sich in einem neuen "Block" und inkrementiert die Zählvariable.


----------



## Chasor (2. Feb 2010)

Michael... hat gesagt.:


> man könnte einfach durch das Array iterieren und jedes Mal wenn man auf eine 1 stösst überprüfen, ob der Vorgänger auch eine 1 ist. Wenn nicht befindet man sich in einem neuen "Block" und inkrementiert die Zählvariable.



So habe ich's mit einer Schleife gemacht, und siehe da: es funktioniert =).
Danke für die schnellen Antworten.

/Edit:
Es gibt ein neues Problem:
Bei z.B. der Matrix "111010201" tritt beim Überprüfen der "Blöcke" eine  ArrayIndexOutOfBoundsException auf.
Der Code der if-Schleife ist:

```
if(field.array[n][i]==1 && field.array[n-1][i]!=1)
			{
				rowbs[i] = rowbs[i] + 1;
			}
```

Logischerweise kann er field.array[-1][0] niemals erreichen.
Wie behebe ich das? Alles in dem Array um 1 verschieben tut's nicht :/.


----------



## sign (2. Feb 2010)

```
int c = 0;
        String s = "111010201";

        Pattern p = Pattern.compile("1+");
        Matcher m = p.matcher(s);

        while (m.find()){
            System.out.println(m.group());
            c++;
        }

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

Hoffe es hilft dir weiter.
lg


----------



## Chasor (2. Feb 2010)

Hilft mir gerade nicht sehr weiter, weil ich die Matrix nicht als zusammenhängenden String habe, sondern als Werte in einem Array.
Bei Matrix-Zeile 1 = 111010201 wäre also array[0][0] = 1; array[0][3] = 0; array[0][6] = 2 usw.

Entweder brauche ich einen anderen Weg, oder eine Möglichkeit, den String für jedes neue i bei array_[n] zu einem ganzen String zusammenzusetzen._


----------



## Michael... (2. Feb 2010)

man könnte die for - Schleife mit i=1 beginnen ;-)

```
char[] c = { 1, 1, 1, 0, 1, 0, 2, 0, 1 };
int count = 0;
if (c[0] == 1)
	count++;
for (int i = 1; i < c.length; i++) {
	if (c[i] == 1 && c[i - 1] != 1)
		count++;
}
System.out.println(count);
```


----------



## Chasor (2. Feb 2010)

Ok, war ein wenig frimelig, aber nun funktioniert es.

Da ich die errechneten Werte mit einem Lösungsergebnis vergleichen will, speichere die Wahrheitswerte jeder Zeile in ein Array boolean[] validrow.

Gibt es eine Möglichkeit eine boolean-Variable zu definieren, die genau dann =true ist, wenn ALLE Arrayfelder von validrow den Wert "true" drin haben?


----------



## Teh_Lord (2. Feb 2010)

Wenn er das so macht würde z.B. 1111 als Ergebnis einen count von 4 liefern, wobei es nur ein Block ist.
Ich würde das so machen:


```
char[] c = { 1, 1, 1, 0, 1, 0, 2, 0, 1 };
int count = 0;
boolean inBlock = false;
for (int i = 0; i < c.length; i++) {
    if (c[i] == 1) {
        if (!inBlock) { 
           count++;
           inBlock = true;
        }
    }
    else inBlock = false;
}
System.out.println(count);
```


Für deinen Boolean-Array wirst du wohl iterieren müssen, also:

```
// Gegeben sei boolean[] validrow
boolean isOnlyTrue = true;
for(int i=0;i<validrow.length;i++){
    if(!validrow[i]){
        isOnlyTrue = false;
        break;
    }
}
```
Also iterieren und sobald ein Falsewert gefunden wird Variable auf false setzen und den Rest muss man ja nicht mehr betrachten.


- Micha


----------



## Chasor (2. Feb 2010)

Problem ist:
valid hat immer den Wert true, (Warnung von Eclipse: "unused" bei boolean valid).

Das Array boolean[] validrow hat aber false-Werte drin (per System.out.println() überprüft).

Kann jemand den Fehler sehen?


```
boolean valid = true;
   		for(int i = 0; i<field.nbCols; i++)
   		{
   			if(!validrow[i])
   			{
   				valid = false;
   				break;
   			}
   		}
   		if(valid=true)
   		{
   			JOptionPane.showMessageDialog(Gui.this, "Glückwunsch! Dein Ergebnis ist korrekt!", "RICHTIG!",JOptionPane.INFORMATION_MESSAGE);
   		}
   		if(valid=false)
   		{
   			JOptionPane.showMessageDialog(Gui.this, "Leider falsch! Versuch es weiter!", "FALSCH!",JOptionPane.INFORMATION_MESSAGE);
   		}
```


----------



## Teh_Lord (2. Feb 2010)

Deine If-Abfragen sind falsch.

Du schreibst:

```
if(valid=true)
        {...}
        if(valid=false)
        {...}
```

Ersetze "valid=..." durch "valid==..." und es sollte funktionieren.

"=" ist eine Zuweisung, "==" ein Vergleich.
So wie du das gemacht hast wird zuerst valid in der IF-Abfrage auf true gesetzt und wenn die Zuweisung funktioniert hat, so wird dem IF "true" gemeldet wodurch dann die Ausgabe erfolgt.

- Micha


----------



## Chasor (2. Feb 2010)

Ah, genau das war's.
Danke vielmals


----------

