1

以下はテキストファイルです。このファイルでは、行の各番号をランダムな順序で出力することにより、各行をランダムな方法で読み取りたいと考えています。各行を1行ずつ読み取り、各行に対応する番号を順番に出力できますが、すべての番号をランダムな順序で出力できるように、行をランダムに読み取る方法はありますか.

 Line1   1  1116    2090    100234  145106  76523
 Line2   1  10107   1008    10187
 Line3   1  10107   10908   1109

任意の提案をいただければ幸いです。以下は、私が書いたコードで、行を順番に読み取ります。

BufferedReader br = null;

    try {
        String sCurrentLine;

        br = new BufferedReader(new FileReader("C:\\testing\\Test.txt"));

        while ((sCurrentLine = br.readLine()) != null) {
            String[] s = sCurrentLine.split("\\s+");
            for (String split : s) {
                if(split.matches("\\d*"))
                System.out.println(split);
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
4

3 に答える 3

4

「ランダムな方法で行を読む」ことはできません (まあ、できますが、それは恐ろしいことです!)

すべての行をコレクションに順番に読み込んでから、コレクションが空になるまで (ランダムに) 1 つずつ選択することをお勧めします。

同様の方法で各行を個別に処理できます。すべての数値を解析してコレクションにし、ランダムに取り出します。

例 (疑似コード)

ArrayList lines = new ArrayList()
while (! EOF)
    lines.append(readLine)

while(lines.size() > 0)
    int index = Random(0, lines.size)
    line = lines[index];
    lines.remove(index)
    processLine(line)
    // processLine does a similar thing to the above but with numbers
    // on a line rather than lines in a file.
于 2012-04-23T00:58:53.667 に答える
1

各行の順序を並べ替える場合は、Collections.shuffle を使用できます。

while ((sCurrentLine = br.readLine()) != null) {
    List<String> s = Arrays.asList(sCurrentLine.split("\\s+"));
    Collections.shuffle(s);
    for (String split : s) {
        if (split.matches("\\d*")) {
            System.out.println(split);
        }
    }
}

これにより、行が順番に出力されますが、各行の数字はシャッフルされます。

行の順序もシャッフルする場合は、各行を に追加しArrayList<List<String>>、ArrayList をシャッフルしてから、各行をシャッフルします。

ArrayList<List<String>> allLines = new ArrayList<List<String>>();
while ((sCurrentLine = br.readLine()) != null) {
    allLines.add(Arrays.asList(sCurrentLine.split("\\s+")));
    Collections.shuffle(allLines);
    for (List<String> s : allLines) {
        Collections.shuffle(s);
        for (String split : s) {
            if(split.matches("\\d*"))
            System.out.println(split);
        }
    }
}
于 2012-04-23T02:01:59.217 に答える
0

こぼれた変数を、テキストファイルの数値のコレクションにしたいタイプの配列リストまたは配列に格納します

于 2012-04-23T01:19:52.603 に答える