Сортировка по возрастанию при записи в текстовый файл - PullRequest
0 голосов
/ 08 мая 2018

Я хочу записать в текстовый файл (которым я управлял).Тем не менее, я хочу отсортировать его по возрасту.

Мои два класса - Персона и Список.

Я реализовал сопоставимый интерфейс следующим образом

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);
         }
      }
   }

Это только печатает имена без какого-либо порядка

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Как говорит Веселин, вам по-прежнему необходимо применить сравнение.

Хотя есть два момента: 1. использовать try-with-resources для Writer, чтобы вам не пришлось явно закрывать его, и 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);
  }
0 голосов
/ 08 мая 2018

a.compareTo(a); -> здесь вы сравниваете эти два и ничего не делаете с результатом. Этот метод CompareTo просто возвращает значение типа int, представляющее, что одно больше другого. В вашем случае вы сравниваете А с А, поэтому всегда получаете 0.

Вам нужно отсортировать свою коллекцию, используя этот компаратор. У Java есть хороший метод сортировки, который берет список сопоставимых элементов и сортирует их. Вы можете попробовать с:

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

Тем не менее, коллекция людей будет отсортирована. Если вы хотите иметь его начальное состояние после этого, вы можете просто скопировать его в новую коллекцию перед сортировкой.

Еще один способ сделать это - через API потока, который будет выглядеть примерно так:

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

Если это вызывает проблемы с памятью, потому что оба решения создают копию отсортированного массива в памяти, вы можете сделать что-то вроде поиска по списку - например, два вложенных цикла или что-то в этом роде, но, на мой взгляд, это излишество

...