如何随机播放数组的内容

所以我的程序应该访问一个文本文档然后做所有当前工作的爵士乐。 我无法弄清楚的唯一问题是如何将数组的内容混洗而不让它们最终相互叠加。 互联网和使用随机和for循环的多次尝试都是无用的。 这是我的代码:

import java.io.*; import java.util.*; public class lab_6 { public static void main(String[] args)throws FileNotFoundException { Scanner input = new Scanner(System.in); //reads from keyboard System.out.println("What is the name of your file. "); String name = input.nextLine(); Scanner reader = new Scanner(new File(name));// Open text file System.out.println("how many names are in your array"); int num = input.nextInt(); String[] names = new String[num]; for (int index = 0; index< names.length; index++) { names[index] = reader.nextLine();// Gets a line while there is one } System.out.println("\nOriginal List"); printList(names); System.out.println("\nShuffled List"); shuffle(names); printList(names); System.out.println("\nSorted List"); Arrays.sort(names); // this is a built in method printList(names); System.out.println("What name are you looking for"); Scanner input1 = new Scanner(System.in); //reads from keyboard String find = input1.nextLine(); int index = search(names,find); if(index == -1) System.out.println("The name was not there"); else System.out.println(find+" was found at position "+index); System.out.println("The average length of all the names is "+averageLength(names)); } public static void printList(String[] array) // print the list of names numbered { for (int i=0; i<array.length; i++) { System.out.println((i+1)+") "+ array[i]); } } public static void shuffle (String[] array) // mix-up the array { } public static int search(String[] array, String find) { for(int i=0; i<array.length; i++) { if (array[i].equals(find) ) return i; } return -1; } public static double averageLength(String[] array) //return the average length of the names { int sum=0; for (int i=0; i<array.length; i++) { int l= array[i].length(); sum +=l; } int average = sum/(array.length); return average; } } 

 String[] names = ...; Collections.shuffle(Arrays.asList(names)); // done 

请注意, Arrays.asList()返回一个可修改(但固定长度)的列表,由数组支持,而不是数组的副本。 因此数组将被洗牌。

只需使用Fisher-Yates shuffle(Knuth算法P):

 private Random rand = new Random(); public static void shuffle(String[] array) { // mix-up the array for (int i = array.length - 1; i > 0; --i) { int j = rand.nextInt(i + 1); String temp = array[i]; array[i] = array[j]; array[j] = temp; } } 

看到:

  1. Knuth,D。1969,1998:Seminumerical Algorithms 1st&3rd Eds。 计算机编程艺术系列,第2卷,p。 125。
  2. 费舍尔,罗纳德A。; 耶茨,弗兰克(1948年)[1938]。 生物,农业和医学研究统计表(第3版)。 伦敦:奥利弗和博伊德。 第26-27页。
  3. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
  4. https://stackoverflow.com/a/1520212/636009

您可以使用带有shuffle方法的Collections类。 文档可在此处获得 。

 int[] values = {1,2,3,4,5}; List valuesList = Arrays.asList(values); Collections.shuffle(valuesList); // valuesList is shuffled.