2016-12-03 1 views
0

У меня есть 2D-массив, который сохраняет ответ «да»/«нет», когда пользователь голосует, поэтому для моей строки строки 1 задан вопрос 1, затем, когда возникает вопрос к системе он переходит в строку 2 и т. д. И идентификатор избирателя - это столбец, мне нужно подсчитать количество ответов «да/нет», чтобы получить количество голосов по каждому вопросу.цикл через 2D-массивы и подсчет результатов для каждой строки отдельно (Java)

Мне удалось пропустить весь массив и подсчитать ответы «да/нет» (что будет работать, если мне нужен только один вопрос), однако я не могу заставить свою систему печатать результаты для каждой строки (вопрос) в цикле.

Вот мои массивы, которые хранят ответы

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

Это, как я храню ответы

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

    } 

И это цикл, где я пытаюсь сосчитать ответы «да/нет» для каждой строки (вопрос)

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

Прежде всего, я думаю, что вы используете неправильные структуры данных для проблемы. Если вы хотите считать ответы «да» и «нет» из списка вопросов, то вы можете использовать структуру данных Map, в которой ключ был бы вопросом (простейшим был бы String), а значение было бы массивом, содержащим фактически 2 Integer s , Но это неинтуитивно. Лучшим подходом было бы создание некоторых объектов домена и работа с ними.

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

и тогда у вас будет только List<Question> questions ...и:

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

но здесь можно было бы улучшить немного так:

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) { 
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

Нет, вам это не понадобится. Но опять же, это зависит. Мой подход - скорее стиль ООП ... – ACV

0

Ваша локальная переменная i внутри цикла for никогда не увеличивается, вы рассчитываете только на первую строку. С int i = 0 ваши заявления if будут проверяться только на Menu.arrayOfAnswers[0][j]. Если у вас есть 2 вопроса, вы должны увеличивать i на один, когда вы закончите считать первую строку.

+0

Если я увеличиваю i ++, то он будет считать голоса в первый и второй строки (вопрос), дающий неправильную сумму да и отсутствие голосов. скажем, это, например .. вопрос1- [да] [нет] [да] [да] вопрос2 - [нет] [нет] [да] [нет] Мне нужно общее количество да и nos для первая строка, затем общее количество второго ряда, и если я добавлю еще один вопрос и т. д. – 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