使用数组列表在 Java 中创建掷骰子。 (不是和数组)

Creating a Dice Roller in Java with an Array List. (Not and Array)

我目前不知道我应该做什么来完成这项工作。作业已经上交,但我正在努力成为一名好学生,并弄清楚为什么它行不通。这是我遇到的问题:

一个运行是相邻重复值的序列。用一个主要方法写一个 Java class 生成一个 ArrayList 中的 20 次随机掷骰子序列,打印骰子值,通过包括标记 运行s 他们在括号中,像这样:

1 2 (5 5) 3 1 2 4 3 (2 2 2 2) 3 6 (5 5) 6 3 1

伪代码: 提示:使用以下伪代码: 将布尔变量 inRun 设置为 false。 对于 ArrayList 中的每个有效索引 i 如果在运行 如果 values[i] 与前面的值不同 打印 )。 在运行 = 假。 如果不在运行 如果 values[i] 与以下值相同 打印 (。 在运行=真。 打印值 [i]。 如果在运行中,打印 ).

我知道有很多这样的问题,但我发誓我都看过了。我找不到使用 ArrayList 与 Array 的足够相似的。

这是我的代码:

package run;

import java.util.ArrayList;
import java.util.Random;

public class DiceRoller {
public static void main(String[] args)
{
    boolean inRun = false;
    int roll;

    ArrayList randomNumList = new ArrayList();
    Random randNum = new Random();

    for(int i = 0; i < 20; i++)
    {
        roll = randNum.nextInt(6);
        randomNumList.add(roll);
    }

    //Gets the size of the ArrayList.
    int sizeOfArray = randomNumList.size();

    for (int i = 0; i <= sizeOfArray; i++)
    {
        if (inRun == true)
        {
            if (randomNumList.indexOf(i) == randomNumList.lastIndexOf(i)) //PROBLEM AREA//
            {
                System.out.print(")");
            }
            inRun = false;
        }

        if (inRun == false)
        {
            if(randomNumList.indexOf(i) == randomNumList.indexOf(i))//PROBLEM AREA//
            {
                System.out.print("(");
                inRun = true;
            }
        }
    }
    System.out.println(randomNumList);
}

我不能为我的生活和互联网弄清楚为什么我不能得到正确的输出。我首先尝试做 if(randomNumList[] == randomNumList[i-1]if(randomNumList[i] == randomNumList[i+1](i))。这是我在网上能找到的所有内容,但给了我一个错误,它不能与 ArrayList 一起使用,它需要一个 Array。所以它在代码中的方式,如果我到目前为止是如何得到它的。输出看起来像这样:

(((((()()()()()()()()()()()()()()()([4, 0, 0, 1, 3, 5, 3, 4, 0, 5, 1, 5, 3, 4, 2, 3, 4, 2, 3, 5]

请帮忙!!

让我们从基础开始。首先,你应该在 for 循环中一个一个地输出列表中的每个元素:

for (int i = 0; i < sizeOfArray; i++) {
    System.out.print(randomNumList.get(i) + 1);
}

这将打印每个骰子卷。 +1 是因为骰子的数字是从 1 到 6,而不是从 0 到 5。 现在让我们通过考虑括号的情况来改进我们的代码:

  1. 如果某个条件得到验证
  2. ,则在 骰子打印之前打印 (
  3. 如果另一个特定条件得到验证
  4. ,则在
    骰子打印后打印 )

像这样:

for (int i = 0; i < sizeOfArray; i++) {
    // Print '(' if ...
    System.out.print(randomNumList.get(i) + 1);
    // Print ')' if ...
}

您需要测试的是"next element",i+1。如果它与当前的相同并且您不在 运行 中,则应该先打印 ( 。或者,如果你实际上在 运行 但下一个打破它,你应该打印 )

for (int i = 0; i < sizeOfArray; i++) {
    boolean isNextTheSame = (i+1 < sizeOfArray) && randomNumList.get(i+1) == randomNumList.get(i);
    if (!inRun && isNextTheSame) {
        System.out.print("(");
        inRun = true;
    }
    System.out.print(randomNumList.get(i) + 1);
    if (inRun && !isNextTheSame) {
        System.out.print(")");
        inRun = false;
    }
}

在您的伪代码中,它测试前一个元素以验证第二个条件,而不是下一个。但是结果是一样的

首先,您的显示完全是错误的,因为您正在执行第一个循环,只显示括号然后显示数组列表的系统输出。

那你的算法不好 ArrayList 可以像数组一样访问(只需使用 .get(index)),这不是问题 ArrayList的功能你应该详细研究一下,我想你还没有明白lastIndexOf和indexOf是干什么的

我建议你这样做 : 通过在 Java 中引用给出的提示 请注意:如果 ArrayList 中的对象是 Integer,则必须使用 equals 而不是 ==

boolean inRun = false;
        for (int i = 0; i < sizeOfArray; i++) {
            // If inRun If values[i] is different from the preceding value Print
            // ).
            if (inRun && randomNumList.get(i) != randomNumList.get(i - 1)) {
                System.out.print(") ");
                inRun = false;
            } else
            // If not inRun If values[i] is the same as the following value
            // Print (
            if (!inRun && i < sizeOfArray - 1 && randomNumList.get(i) == randomNumList.get(i + 1))
            {
                System.out.print("( ");
                inRun = true;
            }

            System.out.print(randomNumList.get(i) + " ");
        }

        if (inRun) {
            System.out.print(") ");
        }