【问题标题】:Running a different method each time through a loop每次循环运行不同的方法
【发布时间】:2023-04-06 03:22:01
【问题描述】:

我的目标是通过循环运行此代码来减少代码

each_score = ones(dice_values);
total_score += each_score;
end_scores += String.valueOf(each_score) + " ";

紧随其后

each_score = twos(dice_values);
total_score += each_score;
end_scores += String.valueOf(each_score) + " ";

唯一的区别是第一行的方法。我不知道通过 for 循环之类的方法来做这样的事情,我宁愿不复制粘贴该代码 13 次。 (如果可能的话,我也希望有比开关盒更有效的东西)

private static int ones(int[] dice_values) {
    int ones = 0;
    for(int i = 0; i < 5; i++)
        if(dice_values[i] == 1)
            ones++;     
    return ones;
}

private static int fours(int[] dice_values) {
    int fours = 0;
    for(int i = 0; i < 5; i++)
        if(dice_values[i] == 4)
            fours++;        
    return (fours * 4);
}


private static int five_of_kind(int[] dice_values) {
    int five_kind = 0;
    int[] five_of = new int[5];
    for(int i = 0; i < 5; i++)
        five_of[dice_values[i] - 1]++;

    if(Arrays.asList(five_of).contains(5))
        five_kind = 50;
    return five_kind;
}

这是方法的示例。我正在解决一个名为 Yahtzee 的简单问题。给定一组 13 个 5 个骰子的掷骰子,求所有掷骰子的总分和每种得分的总和(以“一个:多少个”或“一个种类的五个”为例)。

【问题讨论】:

  • ones()、twos() 等方法的目的是什么?如果它们具有相似的目的,您可以使用参数 1、2 等创建一个通用函数。
  • 我可以结合前 6 种方法来做到这一点,但还有其他方法(4 种,短顺子,长顺子,满屋等)我不能

标签: java loops switch-statement case


【解决方案1】:

您可以在这种情况下使用反射,

string[] methodNames = new string{}["ones","twos",....];
for(string method : methodNames)
{
    Method method = this.getClass().getMethod(dice_values.getClass());
    each_score = method.Invoke(this,dice_values);
    total_score += each_score;
    end_scores += String.valueOf(each_score) + " ";
}

【讨论】:

  • 啊,我真的很喜欢这个解决方案,但不幸的是我是从一个类构建这一切的......但这很有趣,我想我会转换它,所以我的方法不是静态的。
  • 更新:使用此方法我在 getMethod 遇到错误:方法 getMethod(String, Class>...) 在 Class 不适用于参数 (Class) ....................但是,在 getMethod 中添加名称匹配示例消除了错误....将继续工作
【解决方案2】:

除非我遗漏了什么(并且没有switch),否则您可以构建一个int 分数数组并迭代该scores 数组。有点像

int [] scores = new int[] {
        ones(dice_values), twos(dice_values), threes(dice_values), 
        fours(dice_values), fives(dice_values), sixes(dice_values), 
        sevens(dice_values), eights(dice_values), nines(dice_values),
        tens(dice_values), elevens(dice_values), twelves(dice_values),
        thirteens(dice_values)
};
for (int each_score : scores) {
    total_score += each_score;
    end_scores += String.valueOf(each_score) + " ";
}

【讨论】:

    【解决方案3】:
    for(int i = 1; i <= 13; i++) {
        switch(i) {
            case 1:
                each_score = ones(dice_values);
            break;
    
            case 2:
                each_score = twos(dice_values);
            break;
    
            ...
    
        }
        total_score += each_score;
        end_scores += String.valueOf(each_score) + " ";
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2023-03-11
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多