Сортировать ArrayList стран по названию, жителям и размеру - PullRequest
1 голос
/ 09 апреля 2019

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

Так устроен текстовый файл;название страны, жители, размер и капитал.

Belgien     10584534   30528    Bryssel
Bosnien     4590310    51129    Sarajevo    
Cypern      854000     9250     Nicosia
Serbien     7276195    77474    Belgrad

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

Мой код на данный момент:

public class Land {
    static boolean valid = true;

    public static boolean sortNames() {
        File file = new File("europa.txt");
        ArrayList<String> list = new ArrayList<String>();
        try{
            Scanner scan = new Scanner(file);
            while(scan.hasNextLine()){
                list.add(scan.nextLine());
            }
            scan.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();}
        ListIterator iterator = list.listIterator();
        Collections.sort(list);

        System.out.println("Country:       Inhabitants: Size:       Capital: \n");
        for (String element : list) {
            System.out.println(element);
        }

        return valid;
    }

    public static void main(String[] args) {
        System.out.print("\n" + sortNames());
    }
}

Код, который сейчас печатается:

Country:       Inhabitants: Size:       Capital:
Albanien        3581655    28748        Tirana
Belgien         10584534   30528        Bryssel
Bosnien         4590310    51129        Sarajevo

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Для Java 8 и выше:

Вы должны разбить строки и создать Country объекты с полями:

nameOfCountry, habitants, size, capital

После этого вы можете использовать метод List.sort() следующим образом:

list.sort(Comparator.comparing(Country::getNameOfCountry)
                        .thenComparing(Country::getHabitants)
                        .thenComparing(Country::getSize));
3 голосов
/ 09 апреля 2019

Не просто читайте и сохраняйте строки в целом, но разбивайте их на поля и создавайте достойные объекты "Страна".Храните эти объекты в списке.Вы можете использовать Collections.sort (список, компаратор) для сортировки ваших стран по различным реализациям на основе полей объектов вашей страны.

public static boolean sortNames() {
    File file = new File("europa.txt");
    ArrayList<Country> list = new ArrayList<Country>();
    try {
        Scanner scan = new Scanner(file);
        while(scan.hasNextLine()){
            String line = scan.nextLine();
            Country country = new Country();
            // Split the line and fill the country object
            list.add(country);
        }
        scan.close();
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    Collections.sort(list, new Comparator<Country>(){
      @Override
      public int compare(Country c1, Country c2) {
        return c1.getName().compareTo(c2.getName());
      }
    });
    // You can create different comparators and sort based on inhabitants, capital, or even a combination of fields...

    System.out.println("Country:       Inhabitants: Size:       Capital: \n");
    for (Country element : list) {
        System.out.println(element.getName() + ", " + element.getInhabitants() /*etc*/);
    }

    return valid;
}

public class Country {
  private String name;
  private int inhabitants;
  private int size;
  private String capital;

  // constructor
  // getters and setters
}
...