按名称,居民和大小对国家/地区列表进行排序

时间:2019-04-09 13:04:07

标签: java sorting comparator countries

我想创建三种方法,可用于对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 个答案:

答案 0 :(得分:3)

不仅要整体读取和存储行,还要在字段中将它们拆分并创建体面的“ Country”对象。将这些对象存储在列表中。您可以使用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
}

答案 1 :(得分:3)

对于Java 8及更高版本:

您应将行拆分并使用字段创建Country对象:

nameOfCountry, habitants, size, capital

此后,您可以按以下方式使用List.sort()方法:

list.sort(Comparator.comparing(Country::getNameOfCountry)
                        .thenComparing(Country::getHabitants)
                        .thenComparing(Country::getSize));