2014-03-27 121 views
-1

我不得不尝试洗牌数组的值并返回它们的问题。我必须询问用户是否想要使用循环进行随机播放,如果用户回答“y”,则在回答为“n”时显示随机数值,然后离开循环。我将不胜感激任何帮助。阵列洗牌java

这是我到目前为止。

主要类

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(); 


    } 
} 

洗牌类

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); 


    } 
} 
+0

什么是_exact_问题? – Thomas

+0

你的问题是什么? –

+0

'......走出循环......'除了洗牌机中的循环之外,我没有看到任何循环,这可能不是你的意思。 – Thomas

回答

2

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

将数组转换为List,让Collections将其拖动到列表中,然后将列表重新转换为数组。

+0

不需要将列表返回到数组。只需使用Arrays.asList()将数组包装到列表中,将列表进行洗牌,然后将数组进行洗牌。 –

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 += ", "; 
    } 
} 
+0

好的谢谢你的回复,但也许我不是很清楚。我的数组包含值1 ... 15.我必须显示这些值才能请求用户随机播放。这是一个输出示例。数组包含:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15是否希望对这些数字进行洗牌? y数组包含:5 12 7 10 6 9 15 1 13 3 4 11 14 2 8如果用户输入n退出循环。 – PedroIt

+0

@Pedro这个数组包含的值是多少有些不相关的,问题在于你混合了值和索引以及动态和硬编码的数组长度,这很可能会产生错误。 – Thomas