java - 写入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);
}
}
}
这只会打印没有任何顺序的名称
解决方案
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();
}
如果这会导致内存问题,因为这两种解决方案都会在内存中复制已排序的数组,那么您可以执行诸如搜索列表之类的操作 - 例如两个嵌套循环或其他内容,但在我看来这太过分了
推荐阅读
- python - 在类中引用方法有什么好处?
- sql - 从表中计算多个列值
- javascript - 将文本元素定位在父 svg 的左侧
- batch-file - 显示文本文件中任何文件的当前位置路径(带斜杠)
- .htaccess - htaccess - 使用参数重定向网站
- mysql - 如何在插入 MySQL 数据库之前以编程方式检查重复行
- security - 需要帮助了解 ASP.NET Core 2 中的身份验证和身份概念
- python - 如何在 Python 中提取包含指定单词列表之一的句子,后跟形容词
- php - where() 如果变量不等于 null
- reactjs - 测试通过子组件更新的父组件中的状态