2016-12-03 2 views
0

Ich habe ein 2D-Array, das die Antwort Ja/Nein speichert, wenn der Benutzer abstimmt, so für meinen Fall Zeile 1 ist Frage 1, dann wenn eine Frage hinzugefügt Zum System geht es in Zeile 2 usw. Und die Wähler-ID ist die Spalte, was ich brauche, ist die Anzahl der Ja/Nein-Antworten zu zählen, um die Anzahl der Stimmen für jede Frage zu erhalten.Schleife durch 2D-Arrays und zählen die Ergebnisse für jede Zeile getrennt (Java)

Ich habe es geschafft, das gesamte Array durchzulaufen und die Ja/Nein-Antworten zu zählen (was funktionieren würde, wenn ich nur eine Frage wollte), aber ich kann mein System nicht dazu bringen, die Ergebnisse für jede Zeile auszugeben (Frage) in einer Schleife.

Hier sind meine Arrays, die die Antworten speichern

public static List<String[][]> voteList = new ArrayList<String[][]>(); 
public static String[][] arrayOfAnswers = new String[100][100]; 
public static List<Referendum> referendumList= new ArrayList<Referendum>(); 

Dies ist, wie ich die Antworten

System.out.println("Enter your first name here: "); 
    String first = Scanner.nextLine(); 

    System.out.println("Enter your surname here: "); 
    String surname = Scanner.nextLine(); 

    System.out.println("Enter your city here: "); 
    String city = Scanner.nextLine(); 

    User user1=new User(); 


    int vid=user1.getTheIndex(first, surname, city); 
    System.out.println("Enter your answer for the question: "); 
    String theanswer = Scanner.nextLine(); 



    if(theanswer.toUpperCase().equals("YES")) 
    { 
     arrayOfAnswers[qid][vid]=theanswer; 
     voteList.add(arrayOfAnswers); 
     System.out.println("Thanks for voting. \n"); 
    } 

    else if(theanswer.toUpperCase().equals("NO")) 
    { 
     arrayOfAnswers[qid][vid]=theanswer; 
     voteList.add(arrayOfAnswers); 
     System.out.println("Thanks for voting. \n"); 
    } 

    else 
    { 
     System.out.println("You must enter a yes and no answer, please try again."); 

    } 

bin Speicherung Und dies ist die Schleife, wo ich zähle ich versuche zu die Ja/Nein-Antworten für jede Zeile (Frage)

for (Referendum q: Menu.referendumList) 
    { 
     int i=0; 
     int yesCount = 0; 
     int noCount = 0;  


     for(int j=0; j<Menu.arrayOfAnswers[i].length; j++) 
     { 

      if(Menu.arrayOfAnswers[i][j] != null) 
       { 
        if(Menu.arrayOfAnswers[i][j].equals("yes")) 
         { 
          yesCount++; 
         } 
        else if(Menu.arrayOfAnswers[i][j].equals("no")) 
         { 
          noCount++; 
         } 
       } 
     } 
     System.out.print("Referendum : " + q.question + " \n"); 
     System.out.println("Votes yes: " + yesCount); 
     System.out.println("Votes no: " + noCount + "\n"); 
    } 

Antwort

0

Zunächst einmal Looping, ich glaube, Sie verwenden falsche Datenstrukturen für das Problem. Wenn Sie die Ja- und Nein-Antworten aus einer Liste von Fragen zählen möchten, könnten Sie eine Map Datenstruktur verwenden, wobei der Schlüssel die Frage wäre (am einfachsten wäre eine Zeichenfolge) und der Wert wäre ein Array mit tatsächlich 2 Integer s . Aber das ist nicht intuitiv. Ein besserer Ansatz wäre, einige Domänenobjekte zu erstellen und mit ihnen zu arbeiten.

class Question { 
private String content; 
private Integer yesCnt; 
private Integer noCnt; 
... 
// Getters and setters 
} 

und dann hätten Sie nur eine List<Question> questions ...und:

for (Question q : questions) { 
if (userAnswer.equals("yes") { 
    q.setYesCnt(q.getYesCnt++); 
} else { 
    q.setNoCnt(q.getNoCnt++); 
} 
} 

aber hier könnte es ein bisschen so verbessert werden:

class Question { 
private String content; 
private Integer yesCnt; 
private Integer noCnt; 

public void vote(String answer) { 
if (answer.equals("yes") { 
    yesCnt++; 
} else { 
    noCnt++; 
} 
} 
} 

und Sie würden etwas natürlichere wie:

for (Question q : questions) { 
q.vote(userAnswer); 
} 

und später könnten Sie tun:

for (Question q : questions) { 
    System.out.println("Question: "+q.getContent()+" Yes: "+q.getYesCnt()+" No: " + q.getNoCnt()); 
//Or just override toString of Question... and do: 
// System.out.println(q); 
} 
+0

Benötige ich mein 2D-Array nicht mit dieser Methode? es macht jedoch Sinn und scheint wie der logischere Ansatz – JHargreaves

+0

Nein, Sie würden es nicht brauchen. Aber wieder kommt es darauf an. Mein Ansatz ist eher ein OOP-Stil ... – ACV

0

Ihre lokale i Variable innerhalb der for Schleife wird nie inkrementiert, Sie zählen nur für die erste Zeile. Seit int i = 0 werden Ihre if Anweisungen nur für Menu.arrayOfAnswers[0][j] testen. Wenn Sie 2 Fragen haben, sollten Sie i um eins erhöhen, wenn Sie fertig sind, die erste Zeile zu zählen.

+0

Wenn ich i ++ inkrementiere, zählt es die Stimmen ein die erste und zweite Reihe (Frage) geben die falsche Summe von Ja- und Nein-Stimmen. sag das zum Beispiel .. Frage1- [Ja] [Nein] [Ja] [Ja] Frage2 - [Nein] [Nein] [Ja] [Nein] Ich brauche die Gesamtzahl der Ja und Nein für die erste Zeile, dann die Gesamtzahl der zweiten Zeile, und wenn ich eine weitere Frage etc. hinzufügen – JHargreaves

0

Angenommen, Sie haben eine 2D-Array array2D, wenn Sie jedes Element, das Sie durch die Reihen in einer Schleife verarbeiten wollen und in einer Zeile, die Sie Schleife durch die Elemente dieser Reihe haben:

for(int i = 0; i < array2D.lenght; ++i){  // loop for the rows 
    for(int j = 0; j < array2D[i].length; ++j){ //loop for the elements in each row 
     // Do something with element j from row i: array2D[i][j] 
    } 
} 

In Ihrem Falls das Array Menu.arrayOfAnswers ist. Wie Sie Zähler pro Zeile (Frage) wollen, initialisieren die Zähler in der Schleife für die Zeilen (Fragen), kurz vor dem durch die Elemente jeder Zeile (Frage)

int yesCount; 
int noCount; 
for(int i = 0; i < Menu.arrayOfAnswers.lenght; ++i){  // loop for the questions 
    yesCount = 0; 
    noCount = 0; 
    for(int j = 0; j < Menu.arrayOfAnswers[i].length; ++j){ //loop for the answers in each question 
     if(Menu.arrayOfAnswers[i][j] != null) { 
      if(Menu.arrayOfAnswers[i][j].equals("yes")){ 
       yesCount++; 
      } 
      else if(Menu.arrayOfAnswers[i][j].equals("no")){ 
       noCount++; 
      } 
     } 
    } 
} 
+0

Das funktioniert, große Erklärung! Vielen Dank. – JHargreaves

Verwandte Themen