# Werte in Array zählen und Summe der einzelnen Teile ausgeben



## purzel (20. Mai 2012)

Hallo,

ich sitze derzeit an einer Art Umfrage. Die Frage und Antwortmöglichkeiten werden aus der Datenbank gelesen. Die Antworten werden gleich wie die User(ID) mit in die Datenbank eingetragen. Nun mein Problem:

Ich habe z.B. folgendes Array: 
	
	
	
	





```
answers[] {0,1}
```
 das aus 3 Antwortmöglichkeiten generiert wurde (1-3).0 = 1. Antwortmöglichkeit etc.

Das zählen geht noch, in dem ich einfach die Länge aus 
	
	
	
	





```
answers[]
```
 bestimme!

WIE zähle ich die einzelnen Werte? :rtfm:

in dem Fall wäre es:

Antwort 1: 1
Äntwort 2: 1
Antwort 3: 0

LG

purzel


----------



## IMartin (20. Mai 2012)

Bin mir nicht sicher, ob das gemeint war, aber unter der Annahme, dass in answers wirklich nur Werte von 0 bis 2 auftauchen und gezählt werden soll, wie oft diese auftauchen, vielleicht so:


```
int[] answers =  { 0, 1 };
		int[] counter = { 0, 0, 0 };
		
		for(int answer : answers) {
			counter[answer]++;
		}
		
		System.out.println("Antwort 1: " + counter[0]);
		System.out.println("Antwort 2: " + counter[1]);
		System.out.println("Antwort 3: " + counter[2]);
```


----------



## Degush (20. Mai 2012)

Deine Frage ist sehr umständlich formuliert. Was genau willst du?


_"Das zählen geht noch"_
Was für ein Zählen? Was willst du zählen?

_(1-3).0 = 1_
?? Das verstehe ich nicht.

Wenn du meinst, dass du zählen möchtest, wie oft eine bestimmte Antwort angeklickt wurde, nachdem die Antworten in die Datenbank eingetragen worden sind:


```
public void foo()
    {
        String[] antwortmöglichkeiten = {"a","b","c"};
        String[] antworten = {"a","a","b","a","c","c","b","a"};
        int[] antwortenZähler = new int[antwortmöglichkeiten.length];
        for(int i = 0; i < antworten.length; i++)
        {
            for(int j = 0; j < antwortmöglichkeiten.length; j++)
            {
                if ( antworten[i].equals(antwortmöglichkeiten[j]) )
                {
                    antwortenZähler[j]++;
                }
            }
        }
        
        for(int i = 0; i < antwortenZähler.length; i++)
        {
            System.out.println("Antwort "+(i+1)+" wurde "+antwortenZähler[i]+" mal abgegeben");
        }
    }
```


----------



## markus99 (21. Mai 2012)

Du könntest hierbei doch ein Binäres Zählsystem verwenden. Binäre Operatoren gibt es ja in Java (& und | "nur einmal tippen").

A1 = 1
A2 = 1
A3 = 0
-> 110 = 6

Wenn du "6" auflöst, bekommst du immer die exakte Folge zurück.
6 - 2^2 = 1; Rest 2
2 - 2^1 = 1, Rest 0
0 -> 0
= 110

Damit kannst du wensentlich mehr Werte in jeweils einem Integer speichern (und damit weiter arbeiten), was natürlich einfacher ist und im Endeffekt auch weniger Speicher benötigt.

Und bei dem wo du grad hängst musst du nur die Summe des Arrays dafür bilden/abfragen.


----------



## nillehammer (21. Mai 2012)

> Die Frage und Antwortmöglichkeiten werden aus der Datenbank gelesen.


Und da kommt sowas wie 
	
	
	
	





```
SELECT COUNT(...
```
 nicht in Frage? Oder gibt die Datenbankstruktur das nicht her?


----------



## purzel (22. Mai 2012)

IMartin hat gesagt.:


> Bin mir nicht sicher, ob das gemeint war, aber unter der Annahme, dass in answers wirklich nur Werte von 0 bis 2 auftauchen und gezählt werden soll, wie oft diese auftauchen, vielleicht so:
> 
> 
> ```
> ...



Ok, Danke für den Tipp, werde es demnächst ausprobieren!



nillehammer hat gesagt.:


> Und da kommt sowas wie
> 
> 
> 
> ...



Mh, zählt mann damit nicht nur die Gesamtanzahl wie ich es gemacht habe mit 
	
	
	
	





```
answers.length()
```
?


----------



## casi91 (22. Mai 2012)

> Mh, zählt mann damit nicht nur die Gesamtanzahl wie ich es gemacht habe mit answers.length() ?



Das kommt natürlich darauf an, wie du dein SQL gestaltest.
Machst du 
	
	
	
	





```
Select Count(*) from tabelle
```
macht es keinen Unterschied.
Baust du aber noch eine "where"-Klausel ein

```
Select Count(*) from tabelle where antwort = 0
```
Bekommst du die Anzahl der Antworten die 0 sind zurück.
(entsprechend musst du dann noch eine Abfrage für 1 machen, denke aber das ist verständlich ;-) )


----------



## purzel (22. Mai 2012)

@IMartin:

Deine Version funktioniert, allerdings gab es bei dieser Übernahme deines Codes Errors. Ich habe die 
	
	
	
	





```
for()
```
-Schleife umgebaut und die Variable counters angepasst. Das funtioniert jetzt wie gewünscht. 

Danke!! 

Liebe Grüße

purzel


----------



## purzel (22. Mai 2012)

casi91 hat gesagt.:


> Das kommt natürlich darauf an, wie du dein SQL gestaltest.
> Machst du
> 
> 
> ...



Es ist in der Tat umständlich, da meine Umfragen variabel sind. D.h. es können so oder so über 5 Antwortmöglichkeiten geben ^^


----------



## nillehammer (23. Mai 2012)

> Es ist in der Tat umständlich, da meine Umfragen variabel sind. D.h. es können so oder so über 5 Antwortmöglichkeiten geben ^^


Dafür gibt es die _*GROUP BY*_-Klausel. Es lohnt sich, sich mit SQL zu beschäftigen. Das wird Dich am Ende sehr glücklich machen.


----------



## purzel (24. Mai 2012)

Aha, GROUP BY - danke für den Hinweis! Werde es mir bei der nächsten ähnlichen Situation anschauen


----------

