Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中洗牌两个数组_Java_Arrays_Random - Fatal编程技术网

在java中洗牌两个数组

在java中洗牌两个数组,java,arrays,random,Java,Arrays,Random,对不起,我是java初学者。我定义了两个数组。其中一种类型是string,另一种类型是integer。现在,我想洗牌它们,假设id={12,45,78,23}和name={“math”,“physic”,“art”,“computer”}。例如,在洗牌之后,数组将变成id={78,45,23,12}和name={“physic”、“art”、“math”、“computer”}。我写了下面的代码,它不工作。我怎样才能修好它 public class RandomNumber { public

对不起,我是java初学者。我定义了两个数组。其中一种类型是string,另一种类型是integer。现在,我想洗牌它们,假设id={12,45,78,23}和name={“math”,“physic”,“art”,“computer”}。例如,在洗牌之后,数组将变成id={78,45,23,12}和name={“physic”、“art”、“math”、“computer”}。我写了下面的代码,它不工作。我怎样才能修好它

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]);
    }
}  
}
公共类随机数{
公共静态void main(字符串[]args)
{
长[]个数=新长[4];
扫描仪输入=新扫描仪(System.in);
随机id=新随机(4);
字符串[]名称=新字符串[4];
对于(int i=0;i你应该做:

    int randomPosition = id.nextInt(4);
    long temp = numbers[i];
    numbers[i] = numbers[randomPosition];
    numbers[randomPosition] = temp;
你有第三条不同的线路

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]);
        }
    }
}
import java.util.Random;
导入java.util.Scanner;
公共类随机数{
公共静态void main(字符串[]args){
长[]个数=新长[4];
扫描仪输入=新扫描仪(System.in);
随机id=新随机(4);
字符串[]名称=新字符串[4];
系统输出打印(“输入数字:”);
for(int i=0;i
使用集合来洗牌基元类型数组有点过火。。。
它非常简单,可以自己实现该函数,例如http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
导入java.util.*;
课堂测试
{
公共静态void main(字符串参数[])
{
int[]solutionaray={1,2,3,4,5,6,16,15,14,13,12,11};
Shuffleray(Solutionaray);
对于(int i=0;i0;i--)
{
整数指数=rnd.nextInt(i+1);
//简单交换
int a=ar[指数];
ar[index]=ar[i];
ar[i]=a;
}
}
}

可以获取这些数组并将它们添加到列表中,然后使用集合中的洗牌方法:

Collections.shuffle(列表myList);

请参见以下不同问题的相同答案: 你所需要的就是

Arrays.sort(numbers, randomComparator);
其中,randomComparator是Comparator的一个实例,它将随机选择两个元素之间的顺序:

// 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


就这些,享受吧!

既然你有两个值的信息,为什么不使用地图呢

    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);
    }
Map toRandomize=newhashmap();
toRandomize.put(1,“一”);
toRandomize.put(2,“2”);
toRandomize.put(3,“等”);
随机r=新随机();
List keys=new ArrayList(toRandomize.keySet());
而(!keys.isEmpty()){
整数key=keys.remove(r.nextInt(keys.size());
字符串val=toRandomize.get(键);
System.out.println(“key=“+key+”,val=“+val”);
}

对于(int i=0;iright,我消除它。仅供参考:“不工作”不是一个有效的语句-当你执行你的代码时会发生什么,你期望它做什么,你试图解决什么问题?当我输入数字时,我无法输入名称看到这个线程:我认为一个违反合同的比较器可以被视为一个丑陋的黑客行为。它不是一个丑陋的黑客行为,在Javascript世界中经常被用来o、 :)同时,合同的含义应该是你的目标,而不是一些传道者的意见。<代码>它不是一个丑陋的黑客,它经常在JavaScript世界中使用……嗯,你已经证明了我的观点:D无论如何,我认为打破JDK类的合同应该只在特殊的情况下进行,并适当地评论。de不知道comparator接口,所以他检查了javadoc,在第一行他读取了一个比较函数,它对一些对象集合进行了总体排序。这是一个相当混乱的问题。您的解决方案可能在这里有效,但如果有人想重用“洗牌”不同上下文中的comparator将很难失败。这个comparator的Javadoc将清楚地声明,如果在我的代码中使用它,它将用于随机排序
    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);
    }