Java文件排序代码分段解析

主函数段
public class sort {
    public static void main(String[] args) {
        sortFileByNumber("排序前的文件路径", "排序后的文件路径");
    }
}

解析

  • public class sort:定义一个公共类sort
  • public static void main(String[] args):这是Java程序的入口点,程序从main方法开始执行。
  • sortFileByNumber("day01-collection\\src\\SeatNumber", "day01-collection\\src\\SeatNumberSorted"):调用sortFileByNumber方法,传入源文件路径和目标文件路径,执行文件排序操作。

文件排序方法段
private static void sortFileByNumber(String source, String destination) {
    ArrayList<String> list = new ArrayList<>();
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(destination));
         BufferedReader br = new BufferedReader(new FileReader(source))) {
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);
        }
        list.stream()
                .sorted(Comparator.comparingInt(sort::extractNumber))
                .forEach(string -> {
                    try {
                        bw.write(string);
                        bw.newLine();
                    } catch (IOException e) {
                        throw new CompletionException(e);
                    }
                });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

解析

  • ArrayList<String> list = new ArrayList<>():创建一个ArrayList用于存储文件中的所有行。
  • BufferedReader br = new BufferedReader(new FileReader(source)) 和 BufferedWriter bw = new BufferedWriter(new FileWriter(destination)):创建BufferedReaderBufferedWriter对象,分别用于读取和写入文件。
  • while ((line = br.readLine()) != null):循环读取源文件中的每一行,直到文件结束。
  • list.add(line):将读取的每一行添加到ArrayList中。
  • list.stream().sorted(Comparator.comparingInt(sort::extractNumber)):使用流对ArrayList中的元素进行排序,排序依据是extractNumber方法返回的数字。
  • forEach方法内使用匿名内部类重写了Consumer方法,在写入数据时,我们通过抛出CompletionException来处理可能的IOException,这使得我们可以使用Lambda表达式。
  • bw.write(string) 和 bw.newLine():将排序后的每一行写入到目标文件,并在每一行后添加一个换行符。
  • 异常处理:使用try-with-resources确保BufferedReaderBufferedWriter在使用完毕后能够正确关闭。如果在读取或写入过程中发生IOException,则捕获并打印异常。

提取数字方法段
private static int extractNumber(String line) {
    Pattern pattern = Pattern.compile("^[0-9]+");
    Matcher matcher = pattern.matcher(line);
    if (matcher.find()) {
        return Integer.parseInt(matcher.group());
    } else {
        return 0;
    }
}

解析

  • Pattern.compile("^[0-9]+"):使用正则表达式"^[0-9]+"创建一个Pattern对象,该表达式用于匹配字符串开头的数字。
  • Matcher matcher = pattern.matcher(line):使用Pattern对象创建一个Matcher对象,用于匹配输入的字符串。
  • if (matcher.find()):如果Matcher在字符串中找到匹配项,则执行if语句。
  • return Integer.parseInt(matcher.group()):返回匹配到的数字,通过matcher.group()获取匹配的子串,然后使用Integer.parseInt()将其转换为整数类型。
  • return 0:如果字符串开头没有数字,则返回0作为默认值。
结语

通过上述代码,我们实现了基于文件的数字排序功能,这不仅提高了文件处理的效率,也为后续的文件分析和数据处理提供了便利。希望本文能够帮助你理解和掌握Java中文件操作和数据排序的相关知识,为你的项目开发提供帮助

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值