洗牌数组算法-Java

洗牌数组算法-Java,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,我正在编写一个程序,用来读取一个充满链接的.txt文件,并对数组中的链接进行反排序,以便以后可以随机访问这些链接 以下是我所做的(但它不起作用:D): import java.io.*; 导入java.io.FileNotFoundException; 导入java.util.Scanner; 公共类扫描{ 公共静态void main(字符串[]args)引发FileNotFoundException{ 字符串测试=”; int i=0; 内部温度=0; 扫描仪链接=新扫描仪(新文件(“link

我正在编写一个程序,用来读取一个充满链接的.txt文件,并对数组中的链接进行反排序,以便以后可以随机访问这些链接

以下是我所做的(但它不起作用:D):

import java.io.*;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共类扫描{
公共静态void main(字符串[]args)引发FileNotFoundException{
字符串测试=”;
int i=0;
内部温度=0;
扫描仪链接=新扫描仪(新文件(“links.txt”);
while(link.hasNextLine()){
test=link.nextLine();
temp++;
}
link.close();
字符串[]链接=新字符串[temp];
扫描器URL=新扫描器(新文件(“links.txt”);
对于(i=0;i

编辑:我当前的取消排序算法正在显示所有链接的起始顺序。

问题出现在第二个循环中,您正在选择一个随机索引
j
,但是您正在检查当您应该检查
使用的数组是否包含j
时是否使用了[k]==j

因此,一个解决方案是创建一个方法
boolean contains(int[]arr,int val)
,检查它是否已经存在。或者另一个简单的解决方案:

ArrayList<String> links = //read from file

ArrayList<String> unsorted = new ArrayList<String>();

while(links.size() != 0) {
    unsorted.add( links.remove( (int)(Math.random()*links.size()) ) );
}
ArrayList links=//从文件读取
ArrayList unsorted=新的ArrayList();
while(links.size()!=0){
unsorted.add(links.remove((int)(Math.random()*links.size());
}

如果希望在
String[]

中输出,则可以使用
unsorted.toArray()
,问题在于第二个循环中,您选择的是随机索引
j
,但您在检查
所用数组是否包含j
时,正在检查
是否使用了[k]==j

因此,一个解决方案是创建一个方法
boolean contains(int[]arr,int val)
,检查它是否已经存在。或者另一个简单的解决方案:

ArrayList<String> links = //read from file

ArrayList<String> unsorted = new ArrayList<String>();

while(links.size() != 0) {
    unsorted.add( links.remove( (int)(Math.random()*links.size()) ) );
}
ArrayList links=//从文件读取
ArrayList unsorted=新的ArrayList();
while(links.size()!=0){
unsorted.add(links.remove((int)(Math.random()*links.size());
}

如果希望输出为
字符串[]

为什么要重新发明轮子,可以使用
unsorted.toArray()

List<String> list = Arrays.asList(links);
Collections.shuffle(list);
String[] copy = list.toArray(new String[temp]);
List List=Arrays.asList(links);
集合。洗牌(列表);
String[]copy=list.toArray(新字符串[temp]);

如果您使用
列表而不是数组,那么您的代码会简单得多。

为什么要重新发明轮子

List<String> list = Arrays.asList(links);
Collections.shuffle(list);
String[] copy = list.toArray(new String[temp]);
List List=Arrays.asList(links);
集合。洗牌(列表);
String[]copy=list.toArray(新字符串[temp]);

如果您使用
列表
而不是数组,您的代码会简单得多。

您知道
列表
比如
数组列表
吗?@Maljam我听说过,但我不熟悉。这会使这项工作更容易吗?是的,你对涉及
ArrayList
的解决方案满意吗?@Maljam当然,这样我会学到一些新东西:DFYI-有一种标准的洗牌算法,叫做Fisher-Yates或Knuth-Shuffle:或者你知道
List
比如
ArrayList
,但我不熟悉。这会使这项工作更容易吗?是的,你对涉及
ArrayList
的解决方案满意吗?@Maljam当然,这样我会学到一些新东西:DFYI-有一种标准的洗牌算法,叫做Fisher-Yates或Knuth-Shuffle:或者我明白了。。。我来换一下,看看是否修好了。谢谢我知道他想手动完成,但也许很高兴知道,Collections有一个shuffle方法为您实现这一点:Collections.shuffle(list);我懂了。。。我来换一下,看看是否修好了。谢谢我知道他想手动完成,但也许很高兴知道,Collections有一个shuffle方法为您实现这一点:Collections.shuffle(list);