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