结束冰雹序列(Java)

时间:2015-01-15 02:54:26

标签: java arraylist

对于我的班级,我必须编写一个程序,我们必须从任何数字创建一个Hailstone序列 (Hailstone是一个数学理论,如果你将偶数除以2并将奇数加3并加1,那么你最终会得到一个无穷无尽的模式4,2,1,4,2,1)

我的提示是在程序达到4,2,1,4,2,1的两个序列后关闭程序。目前我的代码运行,我可以在这个模式的一个序列切断它。但是,我很难找到一个循环来阻止它结束。我的问题是,我是否设置了代码以便我无法捕获第二个序列?

代码:

Scanner inData = new Scanner(new File("test.txt"));
    ArrayList<Integer> list= new ArrayList<Integer>();

    while(inData.hasNext())
            {
                int num=inData.nextInt();
                int var=list.size();
                list.add(num);

                while(num>1)
                {
                    if(num%2==0)
                    {
                        num/=2;
                        list.add(num);


                    }

                    else
                    {
                        num=(num*3)+1;
                        list.add(num);
                    }
                }


                System.out.print(list);
            }

}

文本输入为10的输出应为:     [10,5,16,8,4,2,1,4,2,1] 目前: [10,5,16,8,4,2,1]

3 个答案:

答案 0 :(得分:1)

我建议编写一个方法,当列表以4,2,1,4,2,1:

结尾时返回true
private boolean finished(List<Integer> list) {
    int len = list.length();

    // check for minimum of 6 entries
    if(len < 6) {
        return false;
    }

    return list.get(len-1) == 1
        && list.get(len-2) == 2
        && list.get(len-3) == 4
        && list.get(len-4) == 1
        && list.get(len-5) == 2
        && list.get(len-6) == 4;
}

然后将while循环更改为:

while(num>1 && !finished(list)) {

答案 1 :(得分:1)

我相信您已经在询问如何查看正在构建的列表中的一系列数字。

这可以通过多种方式完成。可能最简单的只是在您正在构建的列表中搜索模式。

static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
if (Collections.indexOfSublist(list, PATTERN) >= 0) {
    ...
}

这不是非常有效 - 它每次迭代都会进行详尽的搜索。我无法想象这会对您造成问题,但如果是,则使用List.subList来搜索最后的PATTERN.size()元素。

答案 2 :(得分:0)

没错。尝试这个,我认为这将起作用:

Scanner inData = new Scanner(new File("test.txt"));
ArrayList<Integer> list= new ArrayList<Integer>();

while(inData.hasNext())
{
    int num=inData.nextInt();
    int seq = 2
    list.add(num);

    while((num>1)&&(seq>0))
    {
        if(num%2==0)
        {
            num/=2;
            list.add(num);
        }
        else
        {
            if(num==1){
                seq -= 1;
            }
            num=(num*3)+1;
            list.add(num);
        }
    }

    System.out.print(list);
}