2016-12-03 11 views
0

私は、ユーザーが投票したときにyes/noの回答を格納する2D配列を持っています。システムに行2などに行くと、投票者IDは列です、私が必要とするのは、各質問の投票数を得るためにはい/いいえ答えの数を数えることです。2D配列をループし、各行の結果を別々に数えます(Java)

私はアレイ全体をループし、yes/noの答えを計算しています(これは1つの質問だけが必要な場合に有効です)。しかし、システムに各行の結果を表示させることはできません質問)を繰り返します。ここで

は、これは私が答え

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."); 

    } 

を格納していますどのようにされており、これは私がカウントしようとしているループで答え

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

を格納し、私の配列です。各行(質問)のはい/いいえの回答

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"); 
    } 

答えて

0

まず第一に、私はあなたが使用して考えます問題の不正なデータ構造。質問のリストからyesとnoの答えを数えたい場合は、Mapのデータ構造を使用します(ここでは、最も単純なのはStringです)。値は実際には2 Integer 。しかし、これは直感的ではありません。より良いアプローチは、いくつかのドメインオブジェクトを作成し、それを操作することです。

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

次に、List<Question> questions ...そして、:

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

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

と次のような、より自然なものを持っているでしょう:

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

が、ここでそれは少しので、改善される可能性が

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

を、後にあなたができる:

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

この方法で2D配列を必要としませんか?それは理にかなっており、より論理的なアプローチのように思えます。 – JHargreaves

+0

いいえ、あなたはそれを必要としません。しかし、再び、それは依存しています。私のアプローチはOOPスタイルのほうが... – ACV

0

forループ内のローカルi変数は増分されません。最初の行はカウントされません。 int i = 0以降、ifの文は、Menu.arrayOfAnswers[0][j]のテストのみになります。 2つの質問がある場合は、最初の行を数えたら、iを1つ増やす必要があります。

+0

私がi ++をインクリメントすると、投票数がカウントされます第1行目と第2行目(質問)は、間違った投票をしています。 質問1 - [はい] [いいえ] [はい] [はい] 質問2 - [いいえ] [はい] [いいえ] 私は合計でyesとnosが必要です最初の行、次に2行目の合計カウント、そして別の質問などを追加した場合 – JHargreaves

0

は、あなたがその行の要素をループに行を通じて、あなたが持っている行の内側のループにあなたが持っている各要素を処理したい場合は、2D配列array2Dがあるとします。あなたには

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] 
    } 
} 

配列がMenu.arrayOfAnswersの場合あなたは、行ごとにカウンタ(質問を)したいと、ちょうど各行の要素をループする前に、行(質問)のために(質問を)ループ内のカウンタを初期化する

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

それは素晴らしい説明です!ありがとうございました。 – JHargreaves

関連する問題