数组shuffle java

时间:2014-03-27 17:21:57

标签: java

我不得不试图改组数组的值并返回它们。如果用户回答" y"我必须询问用户是否要使用循环进行随机播放。然后如果答案是" n"则显示随机播放值。然后离开循环。我将不胜感激任何帮助。

这是我到目前为止所拥有的。

主要课程

package lab4b;

import java.util.Scanner;

public class Lab4B
{

    public static void main(String[] args)
    {
        final int size = 15;
        char q = 'y';
        boolean flag = false;

        Shuffler myShuffler = new Shuffler(size);

        myShuffler.display();
        System.out.println();

        Scanner input = new Scanner(System.in);
        System.out.printf("Do you wish to shuffle this numbers? ");
        String input2 = input.next();


        myShuffler.shuffle();
        myShuffler.display();
        System.out.printf("Do you wish to shuffle this numbers? ");

        input.close();


    }
}

Shuffler class

package lab4b;

import java.util.Random;

public class Shuffler
{

    private int[] data;

    public Shuffler(int size)
    {
        data = new int[size];

        for (int i = 0; i < size; i++)
        {
            data[i] = i + 1;
        }

    }

    public void shuffle()
    {


        for (int i = 0; i < data.length; i++)
        {
            Random r = new Random(15);

            int second = r.nextInt(15) + 1;
            int temp = data[i];
            data[i] = data[second];
            data[second] = temp;
        }

    }

    public void display()
    {

        String values = "";

        for (int i = 0; i < data.length; i++)
        {
            if (i < 15)
            {
                values += (i + 1);
                if (i < 14)
                {
                    values += ", ";
                }
            }
        }
        System.out.printf("Array Contents: %s \n", values);


    }
}

2 个答案:

答案 0 :(得分:2)

我不知道你为什么要自己编写Shuffle逻辑代码。 Java Collections有一个内置的Shuffle:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List)。还有一个也需要随机:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List,java.util.Random)

将数组转换为List,让Collections随机播放,将列表转回数组。

答案 1 :(得分:0)

这是可能失败的部分:

for (int i = 0; i < data.length; i++)
{
  Random r = new Random(15);

  int second = r.nextInt(15) + 1;
  int temp = data[i];
  data[i] = data[second];
  data[second] = temp;
}

您正在[1,15]范围内创建第二个索引,但如果data数组更小或更大,该怎么办?如果规模越小,如果更大,您将获得IndexOutOfBoundsException,您总是将当前元素与索引1到15的那些元素交换。

在该部分中,您将列出索引而不是值,最多只列出15个:

if (i < 15) //what if data was bigger than 15 elements?
{
  values += (i + 1); //you might want to use data[i] instead of (1 + 1) here.
  if (i < 14)
  {
    values += ", ";
  }
}