首页 > 解决方案 > 写入txt文件时按升序排序

问题描述

我想写入一个文本文件(我已经管理过)。但是,我想按年龄对其进行排序。

我的两个类是 Person 和 List。

我已经实现了可比较的接口,如下所示

public class Person implements Comparable <Person> 

     public int compareTo(Person compareAge) 
   {


      return (this.getAge()- compareAge.getAge());
       }   

在同一个类中,我有一个 toString() 方法,它打印姓名和年龄,例如 David Age 49。

我已经在我的列表类中实现了一个 writePerson() 方法,但我很难让它按年龄排序。

这是我所拥有的...

public void writePerson()
 {

      File file = new File("the link to my extensions// personlist.txt);
      BufferedWriter bufferedFileWriter = null;

      try
      {
         bufferedFileWriter = new BufferedWriter(new FileWriter(payrollFile));
         for (Person a : persons)
         {
            a.compareTo(a);
            bufferedFileWriter.write (a.toString());
            bufferedFileWriter.newLine();
         }
      }
      catch (Exception anException)
      {
         System.out.println("Error: " + anException);
      }
      finally
      {
         try
         {
            bufferedFileWriter.close();
         }
         catch (Exception anException)
         {
            System.out.println("Error: " + anException);
         }
      }
   }

这只会打印没有任何顺序的名称

标签: javacomparetofile-writing

解决方案


a.compareTo(a);-> 在这里你比较这两个并且对结果不做任何事情。这个 compareTo 方法只返回一个 int 值,表示一个是否大于另一个。在您的情况下,您将 A 与 A 进行比较,因此您总是得到 0。

您需要使用该比较器对您的集合进行排序。Java 有一个很好的排序方法,它获取 Comparable 项目的列表并对它们进行排序。您可以尝试:

   Collections.sort(persons);
   for (Person a : persons)
         {           
            bufferedFileWriter.write (a.toString());
            bufferedFileWriter.newLine();
         }

不过,它会使persons集合排序。如果您想在之后获得其初始状态,您可以在排序之前将其复制到新集合中。

另一种方法是通过流 api,它类似于:

 for (Person a : list.stream().sorted((p1, p2)->p1.
                                   compareTo(p2)).
                                   collect(Collectors.toList()))
             {           
                bufferedFileWriter.write (a.toString());
                bufferedFileWriter.newLine();
             }

如果这会导致内存问题,因为这两种解决方案都会在内存中复制已排序的数组,那么您可以执行诸如搜索列表之类的操作 - 例如两个嵌套循环或其他内容,但在我看来这太过分了


推荐阅读