草庐IT

java - 外部洗牌 : shuffling large amount of data out of memory

我正在寻找一种方法来随机播放不适合内存(大约40GB)的大量数据。我有大约3000万个条目,长度可变,存储在一个大文件中。我知道该文件中每个条目的开始和结束位置。我需要随机播放这些不适合RAM的数据。我想到的唯一解决方案是将包含从1到N的数字的数组打乱,其中N是条目数,与Fisher-Yatesalgorithm然后根据此顺序将条目复制到新文件中。不幸的是,此解决方案涉及大量查找操作,因此会非常慢。是否有更好的解决方案来对均匀分布的大量数据进行洗牌? 最佳答案 首先解决shuffle问题。为此,请为您的条目发明一种哈希算法,该算法会

java - 如何仅在数组 Java 的一部分上调用 Collections.Shuffle

所以我有以下数组:String[]randomList=newString[16];randomList[0]="Dog";randomList[1]="Dog";randomList[2]="Cat";randomList[3]="Cat";randomList[4]="Mouse";randomList[5]="Mouse";randomList[6]="Car";randomList[7]="Car";randomList[8]="Phone";randomList[9]="Phone";randomList[10]="Game";randomList[11]="Game";ra

java - Collection.shuffle 不工作 - GWT

使用importjava.util.Collections;就像我应该的那样。不是GWT的。在GWT项目的共享文件夹中放置有错误的类。代码结构如下:ListqaList;qaList=newArrayList();qaList.add("12345mainst","tomah");qaList.add("124mainst","lacrosse");qaList.add("123main","yeeehahaaa");Collections.shuffle(qaList);给我这个错误:[ERROR][_012cfaexam]-Line109:Themethodshuffle(List

java - 如何洗牌除元素外的列表?

我有一个包含值元素的列表整数:0、7、2、1、6、5。我知道我可以使用方法Collections.shuffle(list);打乱我的列表。但我不想改变第二个位置的值。它应该总是7。我该怎么做? 最佳答案 您可以洗牌,然后将7恢复到第二位:Collections.shuffle(list);list.set(list.indexOf(7),list.get(2));list.set(2,7);或更短:Collections.shuffle(list);Collections.swap(list,2,list.indexOf(7));

java - 使用 Collections API 进行随机播放

我感到非常沮丧,因为我似乎无法弄清楚为什么Collectionsshuffling无法正常工作。假设我正在尝试打乱randomizer数组。int[]randomizer=newint[]{200,300,212,111,6,2332};Collections.shuffle(Arrays.asList(randomizer));出于某种原因,无论我是否调用shuffle方法,元素都保持完全相同的排序。有任何想法吗? 最佳答案 Arrays.asList不能与基元数组一起使用。改用这个:Integer[]randomizer=new

java - Collections.shuffle(列表列表)

什么会促使人们使用这种方法?更新:我现在明白了。我喜欢Uri的理由“Shufflingisnotatrivialalgorithm”。这是千真万确的。 最佳答案 人们想要随机打乱有序的元素序列的原因可能有很多。例如,一副纸牌。洗牌不是一个简单的算法,正如排序不是-所以它很常见,需要一个库函数。至于为什么是列表——显然它必须是一个有序的集合,因此不是任何一般的集合。只保证列表及其子类型是有序的。Collections类不提供对数组的操作,但您可以(并且可能应该,为了性能)将ArrayList传递给此方法。

java - 为什么java中Collections的fill(),copy(),reverse(),shuffle()是这样实现的

根据javadoc...Collections.fill()写成如下:publicstaticvoidfill(Listlist,Tobj){intsize=list.size();if(sizeitr=list.listIterator();for(inti=0;i很容易理解为什么他们不使用listIteratorif(size截至RandomAccess的条件。但是size有什么用呢?在上面?我的意思是,与使用iterator相比,是否有显着的性能优势?对于size>=FILL_THRESHOLD而不是size?我也看到了Collections.copy()的相同方法:public

java - Java(或任何语言)概率中的随机洗牌

这个问题在这里已经有了答案:Whatdistributiondoyougetfromthisbrokenrandomshuffle?(10个答案)关闭7年前。所以,我正在Coursera上观看RobertSedgewick的视频,目前正在洗牌。他展示了一个“写得不好”的在线扑克洗牌代码(它还有一些其他错误,我已经删除了这些错误,因为它们与我的问题无关)算法是这样工作的:for(inti=0;i它对所有卡片进行一次迭代。在每次迭代中生成一个随机数,并将第i张卡与第r张卡交换。很简单,对吧?虽然我懂算法,但是我不懂他的概率计算。他说因为Random使用32位种子(或64位,这似乎无关紧要)

java - 我的方法有效吗?

我正在为一副纸牌编写一个代码,用于洗牌。我测试了代码,但我真的不知道它是否真的在做它应该做的事情?你怎么看?这是随机播放方法的代码:publicvoidshuffle(){for(intx=myDeck.size();x>0;x--){Randomrn=newRandom();intindex1=rn.nextInt(52);Cardc=myDeck.remove(index1);myDeck.add(c);}}我的输出似乎在数字上打乱了,但没有像黑桃红心之类的卡片名称,例如,这是我测试代码时的输出:DeuceofspadesSevenofspadesEightofspadesAceo

java - 要洗牌的键值(整数,字符串)列表的最佳结构

我需要在Java中实现一个结构,它是一个键值列表(类型为Integer-String),我想对其进行洗牌。基本上,我想做那样的事情。publicLinkedHashMapgetQuestionOptionsMap(){LinkedHashMapshuffle=newLinkedHashMap();if(answer1!=null)shuffle.put(newInteger(1),answer1);if(answer2!=null)shuffle.put(newInteger(2),answer2);if(answer3!=null)shuffle.put(newInteger(3),