【问题标题】:Take numbers from a file and sort them从文件中获取数字并对其进行排序
【发布时间】:2014-03-05 23:42:31
【问题描述】:

我需要让我的程序读取一个文件,然后获取字符串中的数字并将它们排序到一个数组中。我可以让我的程序读取文件并将其放入字符串中,但这就是我卡住的地方。所有数字都在文件中的不同行上,但在字符串中显示为一个长数字。这是我目前所拥有的:

public static void main(String[] args) {

    String ipt1;
    Scanner fileInput;
    File inFile = new File("input1.dat");

    try {
        fileInput = new Scanner(inFile);
        //Reads file contents
        while (fileInput.hasNext()) {
            ipt1 = fileInput.next();
            System.out.print(ipt1);
        }
        fileInput.close();
    }   
    catch (FileNotFoundException e) {
        System.out.println(e);
    }
}

【问题讨论】:

  • 那么你的问题是什么?
  • @Shrink 如何读取文件并将每一行放入数组元素中?

标签: java arrays string file filereader


【解决方案1】:

我建议使用 fileInput.nextInt() 或任何您想要的类型将值作为数字类型读取,将它们放入数组并使用内置排序,如 Arrays.sort。除非我错过了关于这个问题的更微妙的一点。

【讨论】:

  • 输入列表的大小可能未知。如果是这种情况,请使用 ArrayList。
  • 有效。我没有想过那个特别的小问题。
  • 好吧,将它们作为数字类型阅读帮助我解决了我的第一个问题,但现在我如何为每一行创建值,因为列表的长度不同?(将在此程序上测试多个文件)
  • 按照 SWPhantom 所说的做,并在每一行使用 ArrayList 和 ArrayList.add() 新值。
【解决方案2】:

如果您的任务只是从某个文件中获取输入,并且您确定该文件包含整数,请使用 ArrayList。

import java.util.*;
Scanner fileInput;
ArrayList<Double>ipt1 = new ArrayList<Double>();
File inFile = new File("input1.dat");

try {
    fileInput = new Scanner(inFile);
    //Reads file contents
while (fileInput.hasNext()){
    ipt1.add(fileInput.nextDouble()); //Adds the next Double to the ArrayList
    System.out.print(ipt1.get(ipt1.size()-1)); //Prints out what you just got.
}
fileInput.close();

}   
catch (FileNotFoundException e){
    System.out.println(e);
}

//Sorting time
//This uses the built-in Array sorting.
Collections.sort(ipt1);

但是,如果您最终需要提出一个简单的数组,但可以使用 ArrayLists,您可以添加以下内容:

Double actualResult[] = new Double[ipt1.size()]; //Declare array
for(int i = 0; i < ipt1.size(); ++i){
    actualResult[i] = ipt1.get(i);
}



Arrays.sort(actualResult[]);

【讨论】:

  • 我收到错误消息:线程“main”中的异常 java.lang.Error:未解决的编译问题:数组类型中的方法 sort(int[]) 不适用于参数(ArrayList) 类型不匹配:无法从 double 转换为 int 类型 ArrayList 中的方法 get(int) 不适用于参数 (double)
  • 数据类型其实是double所以我进去改了,会不会是什么影响呢?
  • 如果您要输入双打,您需要更改代码中的一些内容。我将编辑更改。
  • 仍然没有在声明数组的最后一段代码的第一行编译,我迷路了:(
  • 再次更改。愚蠢的错误!
【解决方案3】:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class SortNumberFromFile {
    public static void main(String[] args) throws IOException {
        BufferedReader br = null;
        try {
            System.out.println("Started at " + LocalDateTime.now());
            br = new BufferedReader(new FileReader("/folder/fileName.csv"));//Read data from file named /folder/fileName.csv
            List<Long> collect = br.lines().mapToLong(a -> Long.parseLong(a)).boxed().collect(Collectors.toList());//Collect all read data in list object
            Collections.sort(collect);//Sort the data
            writeRecordsToFile(collect, "/folder/fileName.txt");//Write sorted data to file named /folder/fileName.txt
            System.out.println("Ended at " + LocalDateTime.now());
        }
        finally {
            br.close();
        }
    }
    public static <T> void writeRecordsToFile(Collection<? extends T> items, String filePath) {
        BufferedWriter writer = null;
        File file = new File(filePath);
        try {
            if(!file.exists()) {
                file.getParentFile().mkdirs();
                file.createNewFile();
            }
            writer = new BufferedWriter(new FileWriter(filePath, true));
            if(items != null && items.size() > 0) {
                for(T eachItem : items) {
                    if(eachItem != null) {
                        writer.write(eachItem.toString());
                        writer.newLine();
                    }
                }
            }
        } catch (IOException ex) {
        }finally {
            try {
                writer.close();
            } catch (IOException e) {
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2017-11-20
    • 1970-01-01
    • 2015-12-27
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多