在数组列表中对相同的数字进行分组(Big Java Ex 7.5)

时间:2016-08-04 19:14:34

标签: java arrays

即使使用本书提供的一些伪代码(本章是关于数组和数组列表),我也很难弄清楚如何解决这个问题。顺便说一下,这不是家庭作业,而是我自学。

问题

  

运行是一系列相邻的重复值。写一个程序   生成一系列20个随机骰子投掷并打印骰子   值,通过将它们包含在括号中来标记运行,如下所示:   1 2(5 5)3 1 2 4 3(2 2 2 2)3 6(5 5)6 3 1

书中提示

  

将一个布尔变量inRun设置为false。

     

对于数组列表中的每个有效索引i如果是inRun

     

如果values [i]与前一个值不同Print)inRun = False Else

     

如果值[i]与以下相同   值打印(inRun = True打印值; [i]

我不知道的是暗示是如何帮助的。假设我们有多个数字,例如2 2 2 2这不仅仅是(2 2) 2 2

到目前为止我正在尝试的是什么

import java.util.ArrayList;
import java.util.Random;
class seq
{
    private ArrayList<Integer> nums;
    private Random randNum;
    private boolean inRun;
    public seq()
    {
        nums = new ArrayList<Integer>();
        randNum = new Random();
        inRun = false;
    }

    public void addToArrList()
    {
        for(int i = 0; i < 20 ; i++)
        {
            int addThisNum = randNum.nextInt(20)+1;
            nums.add(addThisNum);
        }
    }

    public void checkSides()
    {
        int count = 0;
        for(int i = 0 ; i < nums.size(); i++)
        {
            if(nums.get(i) != nums.get(i-1))
            {
                inRun = false;
            }
            if(nums.get(i) == nums.get(i+1))
            {
                inRun = true;
            }
        }
    }

    public String toString()
    {
        String output = "Array is:";
        if (output.)
    }
}

另一个尝试

import java.util.Random;
import java.util.ArrayList;
class Seq
{
    private ArrayList<Integer> nums;
    private Random randNum;
    public Seq()
    {
        nums = new ArrayList<Integer>();
        randNum = new Random();
    }
    public void fillArrList()
    {
        for (int i = 0 ; i < 20 ; i++)
        {
            int thisRandNum = randNum.nextInt(20)+1;
            nums.add(thisRandNum);
        }
    }

    public String toString() {
        StringBuilder result = new StringBuilder();
        boolean inRun = false;
        for (int i = 0; i < nums.size(); i++) {
            if (i < nums.size() - 1 && nums.get(i).equals(nums.get(i + 1))) {
                if (!inRun) {
                    result.append("(");
                }
                result.append(nums.get(i));
                inRun = true;

            } else {
                result.append(nums.get(i));
                if (inRun) {
                    result.append(")");
                }
                inRun = false;

            }
        }
        return result.toString();
    }
}

public class Sequence{
    public static void main(String [] args)
    {
        Seq seqObj = new Seq();
        seqObj.fillArrList();
        System.out.println(seqObj.toString());
    }
}

输出

85641520612614320473181113612

201362181920141020(1919)514920162914

ETC

2 个答案:

答案 0 :(得分:2)

我认为他们的意思是这样的:

@Override
public String toString() {
    StringBuilder result = new StringBuilder();
    boolean inRun = false;
    for (int i = 0; i < nums.size(); i++) {
        if (i < nums.size() - 1 && nums.get(i).equals(nums.get(i + 1))) {
            if (!inRun) {
                result.append("(");
            }
            result.append(nums.get(i));
            inRun = true;

        } else {
            result.append(nums.get(i));
            if (inRun) {
                result.append(")");
            }
            inRun = false;

        }
    }
    return result.toString();
}

此外,您可能希望生成1到6之间的Randoms,即

int addThisNum = randNum.nextInt(6) +1; 

答案 1 :(得分:1)

这里randNum.nextInt(20)+1;您生成一个从0到20的随机值,您需要生成一个只需要包含一位数的随机值,

在for循环中的

我在调用nums.get(i-1)的第一个条件中从零开始,这是不正确的,因为i = 0所以i-1将是-1

您可以从上面的代码中检查更多逻辑问题

package com.run;

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

public class Run {
    private ArrayList<Integer> nums;
    private Random randNum;
    private boolean inRun;
    private StringBuffer sb;
    public Run(){
         nums = new ArrayList<Integer>();
         randNum = new Random();
         inRun = false;
         sb = new StringBuffer();
    }
    public static void main(String[] args) {
        Run run = new Run();
        run.addToArrList();
        run.checkSides();
    }
    public void addToArrList()
    {
        for(int i = 0; i < 20 ; i++)
        {
            int addThisNum = randNum.nextInt(9)+1;
            nums.add(addThisNum);
        }
    }

    public void checkSides()
    {
        int count = 0;
        for(int i = 1 ; i < nums.size(); i++)
        {
            if(nums.get(i) != nums.get(i-1))
            {
                if(inRun)
                    sb.append(")");
                inRun = false;
            }
            else
            {
                if(!inRun){
                    System.out.println(nums.get(i));
                    inRun = true;
                    sb.replace(sb.length()-1, sb.length(), "(" + nums.get(i-1));
                }
            }
            sb.append(String.valueOf(nums.get(i)));
        }
        System.out.println(sb.toString());
    }
}