【问题标题】:Java For loop !!! printing out valuesJava For 循环!!!打印出值
【发布时间】:2016-10-28 14:51:52
【问题描述】:

编写一个程序,在一个数组中生成一个包含 20 个随机掷骰子的序列,然后 打印骰子值,仅标记最长的运行时间,如下所示: 1 2 5 5 3 1 2 4 3 (2 2 2 2) 3 6 5 5 6 3 1 如果有超过一次的最大长度,请标记第一个。

我正在研究这个问题,这段代码一直有效,直到计算 maxCount。 但是,我坚持打印最终结果,这意味着我正在处理最后一个 for 循环以打印出问题所需的内容。 但是,结果不是我想要的。我怎样才能弄清楚?

import java.util.Random;

public class AA {

public static void main(String[] args) {
    int count = 1;
    int maxCount = 1;
    int runEndsAt = 0;

    // create array
    int[] num = new int[20];
    // create random object
    Random numbers = new Random();
    for (int i = 0; i < 20; i++) {
        num[i] = numbers.nextInt(6) + 1;
        // added 1 b/c it starts from 0
    }

    boolean inRun = false;
    for (int i = 0; i < num.length; i++) {
        if (inRun) {
            if (num[i] != num[i - 1]) {
                /*
                 * System.out.print("|" + count +"|");
                 * System.out.print(") ");
                 */ inRun = false;

            }
            if (inRun) {
                System.out.print("|" + count + "|");
                count++;
            }
        }
        if (!inRun) {
            if (count > maxCount) {
                maxCount = count;
                runEndsAt = i;
            }
            count = 1;
            if (i < 19)
                // comparing index from i to i+1
                if (num[i] == num[i + 1]) {
                System.out.print("( ");
                inRun = true;
                }
        }
    }
    if (inRun) {
        /*
         * System.out.print("|" + count +"|"); System.out.print(" )");
         */ }

    for (int i = 0; i < num.length; i++) {
        if (i == runEndsAt - maxCount) {

            System.out.println("(");

            if (i == runEndsAt) {
                System.out.println(")");

            }
        }
    }
 }
}

【问题讨论】:

  • 很高兴你得到了代码块(通常人们没有),但是看看代码本身的格式并问自己是否可读。 (提示:不,甚至远程也不行。)让您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。
  • 另外,创建一个不使用“随机”的示例,但仍然存在您尝试调试的错误。然后删除与错误无关的每一行代码。您应该能够将其缩减到 20 行代码(或大约),此时您甚至可以看到出了什么问题。
  • 我试图修复可读的代码。
  • @DanielPark 你努力了多少?
  • 没有。这根本没有格式正确。使用 Cmd-shift-F(在 Mac 上)、Ctrl-Shift-F(在 Windows/Linux 上)。如有疑问,请打开帮助菜单,然后搜索“格式”。

标签: java for-loop


【解决方案1】:

如果您使用 Java - 您可能想要使用 StringBuilder。 解决方案:

import java.util.stream.IntStream;

public class LongestRun {
    public static void main(String[] args) {

        // We are told that die tosses is an Array... so we create one.
        int[] tosses = IntStream.range(0, 20)
                        .map(i -> { return (int) (Math.random() * 6 + 1); } )
                        .peek(System.out::print)
                        .toArray();

        // Counting and generation of output:
        int length = 0, longest = 0, startPos = 0;
        StringBuilder sb = new StringBuilder(""+tosses[0]);
        for (int i=1; i<tosses.length; i++) {
            if (tosses[i-1] == tosses[i]) {
                length++;
            } else {
                length=0;
            }

            if (longest < length) {
                longest = length;
                startPos = i-length;
            }
            sb.append("" + tosses[i]);
        }
        sb.insert(startPos+longest+1, ")");
        sb.insert(startPos, "(");

        // Final result:
        System.out.println("Result:");
        System.out.println(sb.toString());
    }
}

【讨论】:

    【解决方案2】:

    听起来是个有趣的问题。这是我的解决方案:

    import java.util.Random;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class SO_40307704 {
      private final static int NUM_ROLLS = 100;
      private final static Pattern PATTERN = Pattern.compile("(\\d)(\\1)+");
    
      public static void main(String... args) {
        final Random r = new Random();
        final String rolls = Stream.generate(() -> r.nextInt(6) + 1)
            .limit(NUM_ROLLS)
            .map(i -> Integer.toString(i))
            .collect(Collectors.joining());
        Matcher m = PATTERN.matcher(rolls);
        int start = 1;
        int end = 0;
        while (m.find()) {
          if (m.end() - m.start() > end - start) {
            end = m.end();
            start = m.start();
          }
        }
        System.out.println(String.format(
            "%s(%s)%s",
            rolls.substring(0, start),
            rolls.substring(start, end),
            rolls.substring(end)));
      }
    }
    

    希望对你有帮助

    【讨论】:

    • 我确信它可以工作,但为什么要使用正则表达式来计算数字呢?
    • 如果您的数据可以编码为字符串,并且您正在寻找模式(而不是解析),那么正则表达式可能会产生雄辩的代码。在这种情况下,条件得到满足,代码看起来可读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多