2014-02-26 59 views
1

对不起,我是java的初学者。我已经定义了两个数组。其中一种是字符串,另一种是整数。现在,我想洗牌他们。假设id = {12,45,78,23}和name = {“math”,“physic”,“art”,“computer”}。例如,在洗牌之后,数组将变为id = {78,45,23,12}和name = {“physic”,“art”,“math”,“computer”}。我写了下面的代码不起作用。我该如何解决它?在java中洗牌两个数组

public class RandomNumber { 

public static void main(String[] args) 
{ 
    long[] numbers = new long[4]; 
    Scanner input = new Scanner(System.in); 
    Random id = new Random(4); 
    String[] name = new String[4]; 

    for (int i=0; i<=numbers.length; i++) 
    { 
     System.out.print("Enter the numbers: "); 
     numbers[i] = input.nextLong(); 
    } 
    for (int i=0; i<=numbers.length; i++) 
    { 
     int randomPosition = id.nextInt(4); 
     long temp = numbers[i]; 
     numbers[i] = randomPosition; 
     numbers[randomPosition] = temp; 
    } 
    for (int i=0; i<name.length; i++) 
    { 
     System.out.println("Enter the name: "); 
     name [i] = input.nextLine(); 
    } 
    for (int i=0; i<name.length; i++) 
    { 
     int randomPosition = id.nextInt(4); 
     String temp = name[i]; 
     name[i] = randomPosition; 
     name [randomPosition] = temp; 
    } 
    for (int i=0; i<numbers.length; i++) 
    { 
     System.out.println(i + " ID = " + numbers[i] + " and name = " + name[i]); 
    } 
} 
} 
+0

'的for(int i = 0;我<= numbers.length;我++)' - 为什么'='? – Maroun

+0

对,我把它消除了。 – User

+1

仅供参考:“不起作用”不是一个有效的陈述 - 当你执行你的代码时会发生什么,你期望它做什么,你试图解决什么问题? – Joshua

回答

0

你应该这样做:

int randomPosition = id.nextInt(4); 
    long temp = numbers[i]; 
    numbers[i] = numbers[randomPosition]; 
    numbers[randomPosition] = temp; 

你有不同的3号线。

numbers[i] = randomPosition; 

这同样适用于名称。

你也有一些其他的错误。

这里是你的代码修复。
与你的比较。
你会看到改变了什么。

import java.util.Random; 
import java.util.Scanner; 

public class RandomNumber { 

    public static void main(String[] args) { 
     long[] numbers = new long[4]; 
     Scanner input = new Scanner(System.in); 
     Random id = new Random(4); 
     String[] name = new String[4]; 

     System.out.print("Enter the numbers: "); 

     for (int i = 0; i < numbers.length; i++) { 
      numbers[i] = input.nextLong(); 
     } 

     for (int i = 0; i < numbers.length; i++) { 
      int randomPosition = id.nextInt(4); 
      long temp = numbers[i]; 
      numbers[i] = numbers[randomPosition]; 
      numbers[randomPosition] = temp; 
     } 

     System.out.println("Enter the names: "); 

     for (int i = 0; i < name.length; i++) { 
      name[i] = input.next(); 
     } 

     for (int i = 0; i < name.length; i++) { 
      int randomPosition = id.nextInt(4); 
      String temp = name[i]; 
      name[i] = name[randomPosition]; 
      name[randomPosition] = temp; 
     } 
     for (int i = 0; i < numbers.length; i++) { 
      System.out.println(i + " ID = " + numbers[i] + " and name = " + name[i]); 
     } 
    } 
} 
0
Using Collections to shuffle an array of primitive types is a bit of an overkill... 

It is simple enough to implement the function yourself, using for example the http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 

import java.util.*; 

class Test 
{ 
    public static void main(String args[]) 
    { 
    int[] solutionArray = { 1, 2, 3, 4, 5, 6, 16, 15, 14, 13, 12, 11 }; 

    shuffleArray(solutionArray); 
    for (int i = 0; i < solutionArray.length; i++) 
    { 
     System.out.print(solutionArray[i] + " "); 
    } 
    System.out.println(); 
    } 

    // Implementing Fisher–Yates shuffle 
    static void shuffleArray(int[] ar) 
    { 
    Random rnd = new Random(); 
    for (int i = ar.length - 1; i > 0; i--) 
    { 
     int index = rnd.nextInt(i + 1); 
     // Simple swap 
     int a = ar[index]; 
     ar[index] = ar[i]; 
     ar[i] = a; 
    } 
    } 
} 
1

可能采取这些阵列,并将它们添加到列表中,然后用随机方法从类别:

Collections.shuffle(List myList);

看到同样的答案在不同的问题: How can I make this into a loop?

+0

看到这个线程:http://stackoverflow.com/questions/22035176/how-can-i-make-this-into-a-loop –

0

所有你需要的是

Arrays.sort(numbers, randomComparator); 

其中randomComparator是比较的一个实例,谁将会随机选择2个元素之间的顺序:

// assuming T is your array type: 
int compare(T o1, T o2) { 
    return (int)Math.signum(Math.random() * 2 - 1); 
} 

这是什么呢? Math.random() * 2 - 1将生成-1和1之间的数字。关键是它可以生成负数,正数或零。 Math.signum将其转换为-1,0,1。

就是这样,享受!

+0

我认为比较违约可以被认为是一个丑陋的黑客。 – NeplatnyUdaj

+0

这不是一个丑陋的黑客攻击,它也经常用于Javascript世界。 :)另外,契约的含义应该是你的目标,而不是一些传道者的意见。 –

+1

'''这不是一个丑陋的黑客攻击,它经常用在Javascript世界中......“,你已经证明了我的观点:D无论如何,我认为打破JDK类的合同应该只在特殊情况下才能完成并正确评论。考虑别人阅读那些不知道比较器接口的代码,因此他检查了javadoc,并在他读取的第一行上显示“比较函数,它对某些对象集合进行了总排序”。很混乱。你的解决方案可能在这里工作,但如果有人想在不同的环境中重用“混洗”比较器将会很难。 – NeplatnyUdaj

1

当你这样做有两个值的信息,为什么不使用地图

Map<Integer, String> toRandomize = new HashMap<Integer, String>(); 
    toRandomize.put(1, "One"); 
    toRandomize.put(2, "Two"); 
    toRandomize.put(3, "Etc"); 

    Random r = new Random(); 

    List<Integer> keys = new ArrayList<Integer>(toRandomize.keySet()); 
    while (!keys.isEmpty()) { 
     Integer key = keys.remove(r.nextInt(keys.size())); 
     String val = toRandomize.get(key); 
     System.out.println("key=" + key + ", val=" + val); 
    }