有没有比使用多个for循环更好的方法来解决这个问题?

时间:2015-03-27 20:06:55

标签: java if-statement for-loop

我正在尝试编写一个能够为Keirsey Bates人格测试打分的程序。用户传递一个长度为70个字符的字符串,并根据评分方法here评估字符串。

我在下面给出的答案的帮助下改写了程序,但是现在不计算“A”和“B”对于人格类型的第三个和最后一个字母是正确的。我无法弄清楚为什么;因为它们都是相同的循环,所以不应该计算所有的数量吗?

此外,如果您看到任何可以简化或更清洁的内容,我愿意接受建议!

这是我写的程序:

public class KeirseyScorer {
   public static String evaluateSurvey(String responses) {
      int surveyLength = 70, columnNumber;
      String first = "", second = "", third = "", last = "", result = "";
      int numAFirst = 0, numBFirst = 0, numASecond = 0, numBSecond = 0, numAThird = 0, numBThird = 0, numALast = 0, numBLast = 0;

      if(responses.length() != surveyLength || !responses.matches("[AB]*")) {
         result = "ERR!";
      }
      else {
         for(int i = 0; i < surveyLength; i++) {
            columnNumber = i % 7;
            if(columnNumber == 0) {
               if(responses.charAt(i) == 'A') {
                  numAFirst++;
               }
               else {
                  numBFirst++;
               }
            }
            else if(columnNumber == 1 || columnNumber == 2) {
               if(responses.charAt(i) == 'A') {
                   numASecond++;
               }
               else {
                   numBSecond++;
               }
            }
            else if(columnNumber == 3 || columnNumber == 4) {
               if(responses.charAt(i) == 'A') {
                   numAThird++;
               }
               else {
                   numBThird++;
               }
            }
            else {
                if(responses.charAt(i) == 'A') {
                    numALast++;
                }
                else {
                    numBLast++;
                }
            }
         }
         first = checkValues(numAFirst, numBFirst, "E", "I", "X");
         second = checkValues(numASecond, numBSecond, "S", "N", "X");
         third = checkValues(numAThird, numBThird, "T", "F", "X");
         last = checkValues(numALast, numBLast, "J", "P", "X");
         result = first + second + third + last;
      }
      return result;
   }
   public static String checkValues(int a, int b, String aGreater, String bGreater, String tie) {
      String answer = "";
      if(a > b) {
          answer = aGreater;
      }
      else if(a < b) {
          answer = bGreater;
      }
      else {
          answer = tie;
      }
      return answer;
   }

}

2 个答案:

答案 0 :(得分:1)

所有这些条件检查和for循环都可以放入它们自己的方法中,在这种方法中,您可以将每个案例的特定值作为参数传递。例如,if / else作为单个方法:

public void checkVals(int a, int b, String c, String d, String e){
    if ( a > b ) return c;
    if ( a == b ) return d;
    return e;
}

然后只需调用方法并将适当的变量分配给返回值

答案 1 :(得分:1)

您只有一个String,因此只需一个循环即可完成此操作。

不是为每个个性维度使用单独的循环,而是可以简单地获取字符串中的当前索引并使用余数运算符来查找列号,如下所示:

int columnNumber = characterIndex % 7;

第一列为零,最后一列为六,依此类推。如果columnNumber为零,那么您将处理适用于E / I个性维度的答案;一两个意味着S / N维度;三个或四个将意味着T / F维度;五和六将意味着J / P维度。

我会使用一个Map<String, Integer>来保存每个字母的计数,而不是使用多个变量来保持计数,所以如果你找到一个&#34; A&#34;在第一列中,您可以增加&#34; E&#34;像这样:

Integer count = mapFromTypeToScore.get("E");
if (count == null) {
    count = 0;
}
mapFromTypeToScore.put("E", ++count);

然后在结束时你只需要从地图中拉出&#34; E&#34;和&#34;我&#34;并声明该维度的类型是具有最高计数的类型,依此类推。