Java对txt文件中的内容进行排序

如果您的文件中每行都有单词或术语,则可能需要对其进行排序。Java Arrays.sort是执行此操作的常用功能。Collections.sort()是另一个不错的说法。这是一个示例和代码。
在文件EG中,您具有以下txt。

dog 
cat
--windows
--kankan
pps
game
--annot be guaranteed 
as it is, generally speaking, 
--impossible to make any hard gu
arantees in the p
--resence of unsynchr

这是对行进行排序的代码,不包括以“-”开头的行。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
 
 
public class SortFileContent {
	public static void sortObserve() throws IOException {
		File fin = new File("c:\\input.txt");
		File fout = new File("c:\\sorted.txt");
 
 
		FileInputStream fis = new FileInputStream(fin);
		FileOutputStream fos = new FileOutputStream(fout);
 
		BufferedReader in = new BufferedReader(new InputStreamReader(fis));
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
 
		String aLine;
		ArrayList<String> al = new ArrayList<String> ();
 
 
		int i = 0;
		while ((aLine = in.readLine()) != null) {
			///得到你想要的线条,在这里我不想要的东西开始-或者清空
			if (!aLine.trim().startsWith("-") && aLine.trim().length() > 0) {
				al.add(aLine);
				i++;
			}
		}
 
		Collections.sort(al);
		//将排序后的内容输出到文件中,
		for (String s : al) {
		    System.out.println(s);
		    out.write(s);
			out.newLine();
			out.write("-----------------------------------------");
			out.newLine();
		}
 
		in.close();
		out.close();
	}
}

最后,您在sorted.txt文件中获得以下内容。

arantees in the p
-----------------------------------------
as it is, generally speaking, 
-----------------------------------------
cat
-----------------------------------------
dog 
-----------------------------------------
game
-----------------------------------------
pps
-----------------------------------------

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于这么大的文件,我们需要使用外部排序(External Sorting)算法,也叫多路归并排序(Multiway Merge Sort)。这种算法可以将文件分成多个小块,对每个小块进行排序,然后再将它们合并成一个有序的文件。 以下是一个基于Java的实现示例: ```java import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; public class ExternalSort { // 默认每个小块的大小为1G private static final long BLOCK_SIZE = 1024 * 1024 * 1024; /** * 对文件进行排序 * @param inputFile 输入文件路径 * @param outputFile 输出文件路径 * @throws IOException */ public static void sort(String inputFile, String outputFile) throws IOException { // 读取文件,将其分成多个小块 List<File> blocks = splitFile(inputFile); // 对每个小块进行排序 List<BufferedReader> readers = new ArrayList<>(); for (File block : blocks) { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(block), StandardCharsets.UTF_8)); readers.add(reader); } PriorityQueue<String> heap = new PriorityQueue<>(Comparator.naturalOrder()); for (BufferedReader reader : readers) { String line = reader.readLine(); if (line != null) { heap.offer(line); } } // 将排序结果写入输出文件 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), StandardCharsets.UTF_8)); while (!heap.isEmpty()) { String line = heap.poll(); writer.write(line); writer.newLine(); BufferedReader reader = null; for (int i = 0; i < readers.size(); i++) { reader = readers.get(i); if (line.equals(reader.readLine())) { break; } } if (reader != null) { String nextLine = reader.readLine(); if (nextLine != null) { heap.offer(nextLine); } } } writer.close(); // 关闭读取器 for (BufferedReader reader : readers) { reader.close(); } // 删除临时文件 for (File block : blocks) { block.delete(); } } /** * 将输入文件分成多个小块 * @param inputFile 输入文件路径 * @return 小块文件列表 * @throws IOException */ private static List<File> splitFile(String inputFile) throws IOException { List<File> blocks = new ArrayList<>(); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), StandardCharsets.UTF_8)); long blockSize = 0; int blockNum = 0; BufferedWriter writer = null; String line; while ((line = reader.readLine()) != null) { if (blockSize == 0 || blockSize + line.length() + 1 > BLOCK_SIZE) { if (writer != null) { writer.close(); } String blockFileName = inputFile + ".block" + blockNum++; File blockFile = new File(blockFileName); blocks.add(blockFile); writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(blockFile), StandardCharsets.UTF_8)); blockSize = 0; } writer.write(line); writer.newLine(); blockSize += line.length() + 1; } if (writer != null) { writer.close(); } reader.close(); return blocks; } } ``` 这个实现使用了一个 `splitFile` 方法,将输入文件分成多个小块。每个小块的大小为1G,可以根据实际情况进行调整。然后将每个小块读入内存,使用优先队列(`PriorityQueue`)进行排序,最后将排序结果写入输出文件。 注意,在排序过程需要处理小块的边界,以及如果有多个小块有相同的元素怎么处理。另外,在排序完成后需要关闭读取器和删除临时文件。 使用示例: ```java ExternalSort.sort("input.txt", "output.txt"); ``` 这个方法会将 `input.txt` 文件排序后输出到 `output.txt` 文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值