以随机方式读取行,然后以随机顺序打印数字

时间:2012-04-23 00:55:07

标签: java

下面是文本文件,我想通过以某种随机顺序打印行中的每个数字,以某种随机的方式读取每一行。我可以逐个读取每一行,然后按顺序打印每行对应的数字,但是有什么办法我们可以用一些随机的方式读取行,这样我就可以按随机顺序打印所有数字。

 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();
        }
    }

3 个答案:

答案 0 :(得分:4)

你不能“以某种随机方式读取一行”(好吧,你可以,但它会很可怕!)

我建议你将所有的行顺序读入一个集合中,然后一次一个地(随机)挑出它们直到集合为空。

您可以以类似的方式单独处理每一行:将所有数字解析为一个集合,然后随机将它们拉回来。

e.g。 (伪代码)

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.

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分:0)

将您的split变量存储到某些arraylist或您希望在文本文件中包含数字集合的数组中