我想写一个文本文件(我已经管理过)。但是,我想按年龄排序。
我的两个班是人和名单。
我已经实现了类似的界面,如下所示
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);
}
}
}
这只打印没有任何订单的名称
答案 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);
}