Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取文本文件(使用ArrayList分隔、排序、查找数字之间的间隔)_Java_Sorting_Text_Arraylist - Fatal编程技术网

Java 读取文本文件(使用ArrayList分隔、排序、查找数字之间的间隔)

Java 读取文本文件(使用ArrayList分隔、排序、查找数字之间的间隔),java,sorting,text,arraylist,Java,Sorting,Text,Arraylist,我真不好意思说这个问题。因为我不知道怎么做。我有一个文本文件。在这个文本文件中有一百万个数字。它们介于0到999之间,并且每行包含一个数字。我必须用(\n)分隔这些数字,这意味着每行将包含一个整数。然后我得把这些分类。排序后,我将从用户处获取2个输入。然后我必须在第一个文本文件中的这些输入之间找到数字并将其写入新的文本文件 我知道大多数人会说“我们不是傻瓜。你什么都不知道,这个网站不是这样的。”没错,但我必须这么做。我只是想知道我该怎么做。我需要哪些方法或策略?因为我在这里也发现了类似的事情,但

我真不好意思说这个问题。因为我不知道怎么做。我有一个文本文件。在这个文本文件中有一百万个数字。它们介于0到999之间,并且每行包含一个数字。我必须用(\n)分隔这些数字,这意味着每行将包含一个整数。然后我得把这些分类。排序后,我将从用户处获取2个输入。然后我必须在第一个文本文件中的这些输入之间找到数字并将其写入新的文本文件


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

对于数字排序,您可以使用计数排序算法:您的数字范围有限,从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 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);
        }  
    }
}
我们将修改上面的循环,如下所示:

for (int i = 0; i < 1000; ++i) {
    for (int j = 0; j < count[i]; ++j) {
        System.out.println(i);
    }
}
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);
        }  
    }
}
int计数器=0;
对于(int i=0;i<1000;++i){
对于(int j=0;j=start)&&(counter

此方法不是最优的,但易于理解和实现。要获得更快速的解决方案,您可能需要去掉内部循环,用逻辑替换它以添加
count[i]
立即到
计数器
并检测我们需要开始输出的时刻。

对于阅读文件,我建议您使用此选项,这将使您的任务非常简单。

对于排序,请看这个类,它有一个
sort
方法。

用于转换字符串值(从文件中读取)
若要使用该类的int或整数值,它有
parseInt
方法。

下面是一个使用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;
    }
}
publicstaticvoidmain(最终字符串[]args)引发IOException{
最后一对输入=readInput();
最终路径sourceFile=Path.get(“Path”、“to”、“input”、“file”);
最终路径destFile=Path.get(“Path”、“to”、“output”、“file”);
解析的最终IntStream=Files.lines(sourceFile)。
mapToInt(整数::parseInt)。

filter(i->i>=input.getLow()&&i@Calaquessir好吧,那么我想你还有一些阅读工作要做。我不知道你为什么会得到-1。我可以在我的工作中使用这些算法。也感谢你的关注。@Calaquessir很高兴帮助)我还在阅读你的源代码。非常感谢。这将非常有帮助。再次感谢。