读取文本文件(分离,排序,使用ArrayList查找数字之间)

时间:2014-04-27 20:09:17

标签: java sorting text arraylist

我真的很害羞地说这个问题。因为我无法理解如何做到这一点。我有一个文本文件。在这个文本文件中有100万个数字。它们介于0到999之间,每行包含一个数字。我必须用(\ n)分隔这些数字,这意味着每一行都包含一个整数。然后我必须对这些进行排序。排序后,我将从用户获取2个输入。然后我必须在第一个文本文件中的这些输入之间的新文本文件中查找和写入数字。

我知道大多数人会说“我们不是傻子。你什么都不知道,这个网站不是这样的。”那是对的,但我必须这样做。我只是想知道我该怎么做。我需要哪些方法或策略?因为我在这里发现了类似的东西,但我不知道这些对我的工作是否正确。

3 个答案:

答案 0 :(得分:2)

为了阅读文件,我建议你使用它,这将使你的任务变得非常简单 http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

要进行排序,请查看此类,它有sort方法 http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

用于转换字符串值(您从文件中读取)
to int或Integer值使用此类,它具有parseInt方法 http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

答案 1 :(得分:0)

这是一个使用Java 8的简单示例:

public static void main(final String[] args) throws IOException {
    final Pair input = readInput();
    final Path sourceFile = Paths.get("path", "to", "input", "file");
    final Path destFile = Paths.get("path", "to", "output", "file");
    final IntStream parsed = Files.lines(sourceFile).
            mapToInt(Integer::parseInt).
            filter(i -> i >= input.getLow() && i <= input.getHigh()).
            parallel().
            sorted();
    try (final PrintWriter outputFile = new PrintWriter(Files.newBufferedWriter(destFile, StandardCharsets.UTF_8))) {
        parsed.forEach(outputFile::println);
    }
}

private static Pair readInput() {
    final Console console = System.console();
    final String low = console.readLine("Please enter the start number (inclusive): ");
    final String high = console.readLine("Please enter the end number (inclusive): ");
    return new Pair(Integer.parseInt(low), Integer.parseInt(high));
}

private static final class Pair {
    private final int low;
    private final int high;

    private Pair(int low, int high) {
        this.low = low;
        this.high = high;
    }

    public int getHigh() {
        return high;
    }

    public int getLow() {
        return low;
    }
}

readInput()方法使用Console将高值和低值读入保存用户输入的类Pair

main方法调用readInput()然后从输入文件中读取行,过滤掉低于low且高于high的数字,并对结果输出进行并行排序

一旦我们进行了管道设置,我们就会在其上调用forEach并将值写入输出文件。

答案 2 :(得分:-1)

对于数字排序,您可以使用计数排序算法:您有0到999的有限范围数。因此,您可以计算输入文件中每个数字出现的次数:

int[] count = new int[1000];
//depending of scope, maybe you need to fill array with zeroes

...
int number = ...;//read number from file;
count[number]++;

现在,为了将其输出为已排序,您只需要两个循环:

for (int i = 0; i < 1000; ++i) {
    for (int j = 0; j < count[i]; ++j) {
        System.out.println(i);
    }
}

我写这篇文章只是为了确保想法很清楚,尽管你的任务不需要输出所有内容。现在,让我们想象你读了这两个数字;

int start, finish = 0; //value read from input

我们将修改上面的循环:

int counter = 0;
for (int i = 0; i < 1000; ++i) {
    for (int j = 0; j < count[i]; ++j) {
        if ((counter >= start) && (counter < finish)) {//or maybe <=, depending on what exactly do you need
            System.out.println(i);
        }
        counter++;
        if (counter > finish) { //we finished, further iterations are waste of CPU time
            break(2);
        }  
    }
}

此方法不是最佳方法,但易于理解和实施。对于更快速的解决方案,您可能希望摆脱内部循环,将其替换为逻辑以立即将count[i]添加到counter并检测我们何时需要开始输出。