如何使用Java和两个嵌套for循环计算Poker中的对

时间:2018-05-18 18:07:04

标签: java loops nested poker

我对编程非常陌生,而且我一直在尝试练习。基本上我需要计算我在未分类的5张牌中找到的牌对数。我解释它的方式可能是错的, 例如,其中一个字符串如下所示:' sTh3c9hQ' s是黑桃,T是十,h是心... 我不确定为什么我的代码不起作用。可能出于一个非常合乎逻辑的原因我无视。有人可以给我一些建议吗? 感谢。

        int count = 0;
        for(int i = 0; i<hand.length()-2; i+=2){
            for(int j = 1; j<hand.length()-3; j+=2){
                if(hand.charAt(i) == hand.charAt(i+2) && hand.charAt(j) == 
                    hand.charAt(j+3)) {
                        count++;
                        }
                }
            }
        return count;

在&#39; sTh3c9hQ&#39;的情况下所需的输出 将是0,因为没有对。 在'sTh3c9sT&#39;的情况下所需的输出。 将是1,因为有一对。 等。 如果有两对,则计数为2。 如果有三个,则计数为3,等等

3 个答案:

答案 0 :(得分:1)

我个人认为你应该将字符串拆分成一个列表,而不是跟踪你在字符串本身的位置,它使for循环更容易理解。类似的东西看起来像:

    private class ScheduleStudyTime
    {
        public int STUDTIME_ID { get; set; }

        public int DAY_ID { get; set; }

        public int LESSTIME_ID { get; set; }

        public int SCHOOLYEAR_ID { get; set; }
    }

    private void LoadStudyTime()
    {
        var fourths = dbContext.FOURTH.Where(x => x.CHOOSE_SCHEDULE_FOURTH.Any(a => a.SCHEDVARIANT_ID == ScheduleVariant.SCHEDVARIANT_ID)).ToList();
        int fourthCount = fourths != null ? fourths.Count() : 0;
        List<ScheduleStudyTime>[] studyTimeList = new List<ScheduleStudyTime>[fourthCount];
        for (int i = 0; i <= (fourthCount - 1); ++i)
        {
            int fourthId = fourths[i].FOURTH_ID;
            var chooseStudyTime = from CHOOSE_STUDY_FOURTH in dbContext.CHOOSE_STUDY_FOURTH
                                  where CHOOSE_STUDY_FOURTH.STUDY_TIME.SCHOOLYEAR_ID == Properties.Settings.Default.SchoolYearId &&
                                  CHOOSE_STUDY_FOURTH.FOURTH_ID == fourthId
                                  group CHOOSE_STUDY_FOURTH by new
                                  {
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.STUDTIME_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.DAY_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.LESSTIME_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.SCHOOLYEAR_ID
                                  }
                                  into gcsf
                                  select new ScheduleStudyTime
                                  {
                                      STUDTIME_ID = gcsf.Key.STUDTIME_ID,
                                      DAY_ID = gcsf.Key.DAY_ID,
                                      LESSTIME_ID = gcsf.Key.LESSTIME_ID,
                                      SCHOOLYEAR_ID = gcsf.Key.SCHOOLYEAR_ID
                                  };
            studyTimeList[i] = chooseStudyTime.ToList();
        }
        var commonStudyTime = studyTimeList.Aggregate((xs, ys) => xs.Intersect(ys).ToList());
    }

答案 1 :(得分:0)

//if only one pair can exist of each, this should work
int count = 0;
boolean par = false;
for(int i = 0; i<hand.length()-4; i+=2){
    par = false;
    for(int j = i+2; j<hand.length()-2 && !par; j+=2){
        if(hand.charAt(i) == hand.charAt(j)  && hand.charAt(i+1) ==  hand.charAt(j+1)) 
        {
            count++;
            par = true;
        }
    }
}
return count;

答案 2 :(得分:0)

这是一个单行解决方案:

return hand.replaceAll("[a-z]|(.)(?!.*\\1)", "").length();

这将替换所有套装(小写字母)和的所有排名字符,稍后在字符串中添加另一个副本(即删除它们),只留下配对的排名。在结果上调用length()会给出对数的计数。

请参阅匹配所有非配对字符的正则表达式的live demo