Как отсортировать список списков с помощью пользовательского компаратора, который содержит расширенные классы? - PullRequest
0 голосов
/ 26 марта 2019

Кажется, я не могу найти способ отсортировать список по «аренде ()» и «прибыли ()». Как мне этого добиться?

Не могу найти ничего, что могло бы помочь.

Родительский класс:

public abstract class Zone
{
    int area; //zonos plotas kv metrais
    float price; //kaina uz kv metra
    int jobPlaces; //darbo vietu skaicius
    abstract float rent();
    abstract float profit();
    abstract float expenses();
    abstract float totalProfit();
}

У меня есть 3 класса (жилые, коммерческие, промышленные), которые расширяют этот класс и переопределяют его абстрактные методы.

Я определяю списки:

static ArrayList<Zone> coll1 = new ArrayList<Zone>();
static ArrayList<Zone> coll2 = new ArrayList<Zone>();

static ArrayList<ArrayList<Zone>> superCollection = new ArrayList<ArrayList<Zone>>();

Затем я случайным образом (например, 3 жилых зоны, 5 коммерческих зон, 1 промышленная зона) заполняет coll1 и coll2 и добавляет их в суперколлекцию.

Как я могу отсортировать superCollection с помощью «rent ()», распечатать его, а затем отсортировать по «profit ()» по возрастанию или убыванию?

Edit:

Collections.sort(superCollection, new Comparator<ArrayList<Zone>>()
{
    @Override
    public int compare(ArrayList<Zone> arg0, ArrayList<Zone> arg1)
    {
        return arg0.get(0).profit().compareTo(arg1.get(0).profit());
    }
});

Пробовал запустить это, но это все равно не сортируется по прибыли:

zone                 rent           profit                          
Residential zone:   11578.3         5534.4             
Residential zone:    1963.7         2935.1              
Residential zone:    4029.5         4987.2             
Residential zone:   13399.6        11453.7             
Residential zone:    2763.7         7212.9              
Residential zone:    3961.3         3384.8                  
Commercial zone:    29041.3        59291.3             
Commercial zone:    10483.6        42842.5             
Industrial zone:    48332.3       939667.0          
Industrial zone:    31563.8      1074516.2            
Residential zone:    8347.1         3587.1                 
Commercial zone:    26177.9        47750.9            
Industrial zone:    33917.8      1005413.1            
Industrial zone:    25704.2      1251655.3            
Industrial zone:    30268.5      1131300.0             
Industrial zone:    42225.1       588861.8                            
Industrial zone:    32779.2      1220447.5          
Industrial zone:    19686.2       863131.5 

1 Ответ

0 голосов
/ 26 марта 2019

Поскольку распечатывать списки нужно двумя разными способами, вам понадобятся два компаратора. Объедините список из супер-коллекции в один список, отсортируйте его с помощью первого компаратора, распечатайте его, отсортируйте со вторым компаратором, а затем напечатайте снова.

private Comparator<Zone> rentComparator = new Comparator<Zone>() {

        @Override
        public int compare(Zone o1, Zone o2) {
            Float o1Rent = o1.rent();
            Float o2Rent = o2.rent();

            return o1Rent.compareTo(o2Rent);
        }
    };

private Comparator<Zone> profitComparator = new Comparator<Zone>() {

        @Override
        public int compare(Zone o1, Zone o2) {
            Float o1Rent = o1.profit();
            Float o2Rent = o2.profit();

            return o1Rent.compareTo(o2Rent);
        }
    };

public void printSortedLists(List<List<Zone>> superCollection) {

    List<Zone> combinedList = new ArrayList<>();
    for (List<Zone> list : superCollection) {
        combinedList.addAll(list);
    }
    Collections.sort(combinedList, rentComparator);

    //TODO now print the rent sorted list here

    Collections.sort(combinedList, profitComparator);

    //TODO now print the profit sorted list here
}
...