0

100000個のファイルを含むフォルダーがあり、ランダムサンプリングによってこのフォルダーから1000個のファイルを取得する必要があります。フォルダからサンプリングするために使用できるサンプル関数はありますか?さらに、サンプリングされたファイルを別のフォルダにコピーするにはどうすればよいですか?

4

3 に答える 3

3

ランダムな選択は、次の行に沿って続く可能性があります

File files[] = new File("/path/to/files").listFiles();
Map<Integer, File> selection = new HashMap<Integer, File>(1000);
while (selection.size() < 1000) {
    int value = (int)Math.round(Math.random() * files.length);
    if (!selection.containsKey(value)) {
        selection.put(value, files[value]);
    }
}
for (File file : selection.values()) {
    System.out.println(file);
}

基本的に、利用可能なファイルのリストを取得し、十分なサンプルが得られるまでリストをランダムに選択する必要があります。チェックアウトjava.io.File

ネット(およびSO)を介したファイルコピーの例はたくさんあります。本当に行き詰まっている場合は、ファイルに対処できるユーティリティクラスがあると私が信じているIOTrailまたはApacheCommonsIOを見ることができます。

更新しました

Andrewが提案したように、ファイルリストをシャッフルして、最初の1000個の要素をプルするだけです...

File files[] = new File("/path/to/files").listFiles();
List<File> selection = null;
List<File> fileList = new ArrayList<File>(Arrays.asList(files));
Collections.shuffle(fileList);
selection = fileList.subList(0, Math.min(1000, fileList.size()));

for (File file : selection) {
    System.out.println(file);
}
于 2012-11-06T03:35:34.483 に答える
1

これを試してみてください

public static void main(String args[]) throws Exception
{
File f= new File("E:/Eclipse-Leo/Test/src/test/Desktop1");
List<File> randomFiles = new ArrayList<File>();
List<Integer> randNumber = new ArrayList<Integer>();
if(f != null && f.isDirectory()){
    File[] files = f.listFiles();
    Random randomGenerator = new Random();
    int idx = 1;

    while(idx <101 && idx >= 1)
    {

        int randTemp = randomGenerator.nextInt(1000);
        if(!randNumber.contains(randTemp))
        {
                 randNumber.add(randTemp);
                 randomFiles.add(files[randTemp]);
                 idx++;
        }

    }

}

}
于 2012-11-06T03:45:14.387 に答える
0

File[]ファイル=dir.listFiles();

次に、files.lengthと乱数ジェネレーターを使用して配列にインデックスを付けます。

于 2012-11-06T03:31:34.907 に答える