我有12个文件
每个文件里均有一列double数值
每列数值都可以分成4个二维数组
现在想进行T次循环,
循环一次,通过随机置换每次都把各个文件的二维数组随机呼唤一遍,当然每个文件的每个二维数组都被呼唤至少一次
有点绕,不知道说明白没有,能不能给个思路?我现在想的是:
1,先把所有文件随机置换一遍,每次处理一个文件,在这个文件里把它自己的二维数组随机处理一遍,然后再进行下个文件。发现不对劲,没按照原题走。
2,然后我就想是不是可以把所有的12个文件的二维数组存到一个大的List里,然后进行随机呼换每个数组进行处理。但是感觉有点笨
3,又想了一下,是不是把12个文件放到一个文件里,列成12个列,但是没办法随机抽取对应的二维数组达人还有什么方法吗?谢谢啦

解决方案 »

  1.   

    把12行数据放成1行就可以了
    每行有个基数,比如第一个文件基数 是 0 用fileIndex表示第二个文件就是1了那么循环时用Math.abs(new Random().nextInt()%4+ fileIndex*4)
    这样随即置换就可以了。
    array[];
    for(int i=0;i<48;i++){
    int rd = Math.abs(new Random().nextInt()%4+ fileIndex*4;
    swap(i,rd);//交换
    }
    楼主是这么个意思吗?
      

  2.   

    我有12个文件
    每个文件里均有一列double数值
    每列数值都可以分成4个二维数组
    现在想进行T次循环,
    循环一次,通过随机置换每次都把各个文件的二维数组随机呼唤一遍,当然每个文件的每个二维数组都被呼唤至少一次不明白题意(原题是什么样的,或把要求说清楚点)
      

  3.   

    如果文件不大的话,建议还是全部Load到内存中,做成二维数组处理,处理完毕后再回写文件。否则直接基于文件进行交换,你的IO复杂度太高了。另外因为你要求:每个文件的每个二维数组都被呼唤至少一次。建议顺序处理这个二维数组的每一个元素,但是每次置换时,用随机数选来则置换目标。2楼的算法其实也就是这个意思了,只不过是基于一维数组的。
      

  4.   

    那我如果只有两个文件,每个文件里有四个数组。是不是大家就建议我把8个数组放一起,随机抽取进行处理?
    我现在有12个文件,每个文件都有四个数组,(也许也可以有更多文件,对应的可以有更多数组)
    只是每个文件里都是double数字,这些数字都在一个列里。我已经按题目要求把每个文件的一列数字分成了4个数组。
    现在就要求把所有12个文件的所有数组,也就是总计48个数组随机抽取进行处理,我看你们的回复,感觉就是要把这48个都放一起随机抽取处理方便。二楼没看懂啥意思。
      

  5.   

    我要做检测,每个文件都有一万个double数字。有些数组的值类似,我要最好把图画出来,类似的数组在图中会重复出现恒定显现,不类似的就无规律。所以我现在随机的次数越多越好,越随机越好,越能证明我的样本和code有效,天不知道说的明白不
      

  6.   

    主要考虑是,你如果要基于文件直接进行处理,进行抽取交换的代价比较高:
    每次交换都需要重新写文件,而且你的文件还不是定长结构,所以写进去的数字长度会导致整个文件的重排。比如你刚好要交换:A文件的第一个数 10 <--> B文件的第三个数 99.88
    那么这两个数长度是不一样的,你为了让交换立即反映回文件去,重写的时候相当于要重写整个文件。所以,反正你的数据规模不大,全部装载进内存进行运算,然后再重写所有文件,效率肯定是最高的。
    另外,有一点没有太清晰:是不是你A文件的数字只会在A文件内部随机交换?如果是这样的话,也可以逐个文件处理,不需要一次性装载所有文件。甚至可以并发多线程处理,反正文件之间互不相干。
      

  7.   

    谢谢楼上,我看是看明白了,不过才学java,上手挺困难的。内存和code联系不到一起。水平有限,这帖子我结了,高人的高招估计得再学一段时间才能明白,sign....