如何从java中的多个文件中排序数据

时间:2015-11-12 15:34:08

标签: java file sorting

我目前正在玩java,我想知道是否可以从几个文件中读取,然后从所有文件中按字母顺序对内容进行排序?

如果有可能,我可以整行,并根据第一个短语对其进行排序?

示例:

此,

ECE3111 A- 4.00

ECE3031 A- 4.00

CS1003 B + 4.00

会返回此内容,

CS1003 B + 4.00

ECE 3031 A- 4.00

ECE3111 A- 4.00

名称的长度总是为6到8,那么有没有办法只根据字符串中前n个位数对行进行排序?

任何提示都将不胜感激。

3 个答案:

答案 0 :(得分:2)

是的,有可能。为此,您需要遵循以下一般流程:

  • 创建list以存储
  • 中的每一行
  • 读取第一个文件(带BufferedReader),逐行存储到列表中
  • 对每个文件重复上述内容
  • 对行列表进行排序(可以使用Java&#39; CollectionsCollections.sort(Collection<T> c)本地完成
  • 从文件输出每一行,或根据需要处理

首先,创建您的列表:

List<String> lines = new ArrayList<String>();

在我们阅读文件时,我们会将每行添加到此list,以便我们可以存储,排序并稍后输出。接下来,我们需要读入每个文件并存储它。可以在here找到一个在java中逐行读取文件的好指南。我将使用BufferedReader和前一个链接中的技术使用1个文件执行此操作。您可以通过循环遍历需要读取的文件列表来执行多个文件。

    BufferedReader fileReader = new BufferedReader(new FileReader("text.txt")); // Create reader with access to file
    String fileLine = fileReader.readLine(); // Read the first line
    while (fileLine != null) { // While there are still lines to read, keep reading
        lines.add(fileLine); // Store the current line
        fileLine = fileReader.readLine(); // Grab the next line
    }
    fileReader.close(); // Read all the lines, so close the read

以上代码将读取文件text.txt中的每一行,并将其添加到创建的list中。现在我们可以使用Java Collections库,并使用它对list行进行排序。这可以通过调用Collections.sort(obj)来完成。因此,使用我们的代码,我们称之为:

Collections.sort(lines);

现在,在我们的lines列表变量中,我们读取了文件中所有行的已排序list。现在,您可以使用此排序list执行任何操作!我决定只输出它。

    for(String line : lines){
        System.out.println(line);
    }

完整的代码是:

public static void main(String[] args) throws Exception {


    List<String> lines = new ArrayList<String>();

    BufferedReader fileReader = new BufferedReader(new FileReader("text.txt")); // Create reader with access to file
    String fileLine = fileReader.readLine(); // Read the first line
    while (fileLine != null) { // While there are still lines to read, keep reading
        lines.add(fileLine); // Store the current line
        fileLine = fileReader.readLine(); // Grab the next line
    }
    fileReader.close(); // Read all the lines, so close the read

    Collections.sort(lines);
    for(String line : lines){
        System.out.println(line);
    }

}

我在包含以下内容的文件text.txt上运行此代码:

ECE3111 A- 4.00
ECE3031 A- 4.00
CS1003 B+ 4.00

我得到了输出:

CS1003 B+ 4.00
ECE3031 A- 4.00
ECE3111 A- 4.00

要获取目录中的所有文件,我们可以创建代表文件名称的listString个变量。然后,遍历目录中的所有文件,并检查它们是否以您要查找的扩展名结束。

    List<String> textFileNames = new ArrayList<String>();
    File directory= new File("StackTxtFiles"); // Point to your directory you want to search
    for (File file : directory.listFiles()) // Loop over everything that exists in the directory
    {
       if (file.getName().endsWith(".txt")) // if the extension is ".txt", it's a text file so we should include it
       {
           textFileNames.add(file.getName()); // Add the file's name to the included list
       }
    }

然后,在用于读取文件的代码中,将其放在循环遍历textFileNames list的循环内,并使用String变量作为传递给{{的文件名1}}而不是硬编码的值。

FileReader

答案 1 :(得分:0)

是的,这是可能的。

我建议将所有字符串加载到ArrayList<String>,调用Collections.sort(<List name>);,然后使用增强的for循环将其写入您选择的文件。

希望这有帮助!

答案 2 :(得分:0)

您可以将TreeSet与您选择的比较器一起使用。

所以Set A可以有一个比较器来比较整个单词。

Set B可以有一个比较器,只比较单词的前3个字母(子串)。

然后你只需遍历文件,将它们添加到你的集合中,然后就完成了。