【问题标题】:loop through 2D arrays and count the results for each row separately (Java)循环遍历二维数组并分别计算每一行的结果(Java)
【发布时间】:2016-12-03 22:05:47
【问题描述】:

我有一个二维数组,当用户投票时存储答案是/否,所以对于我的情况,第 1 行是问题 1,然后当问题添加到系统时,它会转到第 2 行等。选民 ID 是列,我需要的是计算是/否答案的数量,以获得每个问题的票数。

我已经设法遍历整个数组并计算是/否答案(如果我只想要一个问题,这将起作用),但是我似乎无法让我的系统打印每一行的结果(问题) 循环。

这是我存储答案的数组

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

【问题讨论】:

    标签: java loops for-loop iteration


    【解决方案1】:

    首先,我认为你使用了不正确的数据结构来解决这个问题。如果您想从问题列表中计算是和否的答案,那么您可以使用Map 数据结构,其中键是问题(最简单的是字符串),值是实际上包含 2 的数组Integers。但这是不直观的。更好的方法是创建一些域对象并使用它们进行操作。

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

    然后你将只有一个List&lt;Question&gt; 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);
     }
    

    【讨论】:

    • 这种方法不需要我的二维数组吗?但这是有道理的,而且似乎是更合乎逻辑的方法
    • 不,你不需要它。但同样,这取决于。我的方法更像是一种 OOP 风格...
    【解决方案2】:

    for 循环中的本地 i 变量永远不会增加,您只计算第一行。由于int i = 0,您的if 语句将只测试Menu.arrayOfAnswers[0][j]。如果您有 2 个问题,则应在计算完第一行后将 i 加一。

    【讨论】:

    • 如果我增加 i++,那么它将计算第一行和第二行(问题)中的票数,给出错误的是票和否票总数。例如说这个.. question1- [yes][no][yes][yes] question2 -[no][no][yes][no] 我需要第一行的 yes 和 nos 的总数,然后第二行的总数,如果我添加另一个问题等。
    【解决方案3】:

    假设您有一个二维数组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++;
                } 
             }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-12
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多