写入txt文件时按升序排序

时间:2018-05-08 12:29:06

标签: java compareto file-writing

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

我的两个班是人和名单。

我已经实现了类似的界面,如下所示

public class Person implements Comparable <Person> 

     public int compareTo(Person compareAge) 
   {


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

在同一个类中,我有一个toString()方法,它打印名称和年龄,例如大卫时代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);
         }
      }
   }

这只打印没有任何订单的名称

2 个答案:

答案 0 :(得分:1)

a.compareTo(a); - &gt;在这里你比较这两个并且对结果不做任何处理。这个compareTo方法只返回一个int值,表示一个是否大于另一个。在你的情况下,你比较A和A,所以你总是得到0。

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

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

它会将人员集合排序。如果您想在之后拥有其初始状态,则可以在排序之前将其复制到新的集合中。

另一种方法是使用stream api,它将类似于:

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

如果这会导致内存问题,因为两个解决方案都会在内存中复制已排序的数组,那么您可以执行类似于搜索列表的操作 - 例如两个嵌套循环或其他东西,但这样做有点过分了我的意见

答案 1 :(得分:1)

像Veselin所说,你仍然需要实际应用你的比较。

虽然有两点:1。对Writer使用try-with-resources,这样你就不必明确地关闭它了.2。使用Stream进行迭代。

这会使它成为

try (FileWriter fileWriter = new FileWriter("yourfile");
     BufferedWriter writer = new BufferedWriter(fileWriter)) {
     persons.stream()    // create Stream
            .sorted()    // apply sorting
            .forEach(s -> writer.write(s + "\n"); // write
  }
  catch (Exception anException)
  {
     System.out.println("Error: " + anException);
  }