Как реализовать универсальный компаратор для пользовательского класса - PullRequest
0 голосов
/ 07 июня 2019

Я хочу отсортировать пользовательский класс, который содержит некоторые элементы данных.Здесь я создал класс под названием Universal & Showroom Оба. Содержит ценник как общий.Я хочу создать общий Comparator compare (), который должен быть общим для обоих классов. Оба класса имеют одинаковые поля с разными значениями.Оба значения должны быть отсортированы в порядке возрастания.

public class Showroom  {
    String phone_vendor;int price,ram,storage;

    public Showroom(String phone_vendor, int price, int ram, int storage) {
        this.phone_vendor = phone_vendor;
        this.price = price;
        this.ram = ram;
        this.storage = storage;
    }

}
public class Universal {
    String phone_vendor;
    int price,ram,storage;

    public Universal(String phone_vendor, int price, int ram,int storage) {
        this.phone_vendor = phone_vendor;
        this.price = price;
        this.ram = ram;
        this.storage=storage;
    }
}

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Просто пример комментария, который я дал ранее.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public abstract class Parent {
    String phone_vendor;int price,ram,storage;

    public Parent(String phone_vendor, int price, int ram, int storage) {
        this.phone_vendor = phone_vendor;
        this.price = price;
        this.ram = ram;
        this.storage = storage;
    }

    public static void main(String[] args) {
        Universal us = new Universal("Samsung", 51, 5, 11);
        Showroom sr = new Showroom("Nokia", 50, 4, 10);

        List<Parent> lst = new ArrayList<Parent>();
        lst.add(us);
        lst.add(sr);
        Collections.sort(lst, new PriceComparator());

        for(Parent p:lst) {
            System.out.println(p.price);
        }

    }
}


class Showroom extends Parent {

    public Showroom(String phone_vendor, int price, int ram, int storage) {
        super(phone_vendor, price, ram, storage);
    }

}
class Universal extends Parent {
   public Universal(String phone_vendor, int price, int ram, int storage) {
       super(phone_vendor, price, ram, storage);
   }
}

class PriceComparator implements Comparator<Parent> {
    @Override
    public int compare(Parent o1, Parent o2) {
        return o1.price - o2.price;
    }
}
1 голос
/ 07 июня 2019

Еще один вариант с Generics:

    import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class GenericComparator<T> implements Comparator<T> {

    @Override
    public int compare(T o1, T o2) {
        int price1 = 0;
        int price2 = 0;
        try {
            Method m1 = o1.getClass().getDeclaredMethod("getPrice", o1.getClass().getClasses());
            price1 = (int) m1.invoke(o1);
            Method m2 = o2.getClass().getDeclaredMethod("getPrice", o1.getClass().getClasses());
            price2 = (int) m2.invoke(o2);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return price1 - price2;
    }

    public static void main(String[] args) {
        List<Showroom> showRoomList = new ArrayList<Showroom>();
        showRoomList.add(new Showroom("IPHONE", 9000, 4, 4));
        showRoomList.add(new Showroom("SAMSUNG", 5000, 4, 4));
        showRoomList.add(new Showroom("MOTO", 8000, 4, 4));
        showRoomList.add(new Showroom("SONY", 7000, 4, 4));

        List<Universal> universalList = new ArrayList<Universal>();
        universalList.add(new Universal("IPHONE", 100000, 4, 4));
        universalList.add(new Universal("SAMSUNG", 222222, 4, 4));
        universalList.add(new Universal("MOTO", 44444, 4, 4));
        universalList.add(new Universal("SONY", 7055500, 4, 4));
        System.out.println("Showroom");
        Collections.sort(showRoomList, new GenericComparator<Showroom>());
        for (Showroom s : showRoomList) {
            System.out.println(s.getPrice());
        }
        System.out.println("Universal");
        Collections.sort(universalList, new GenericComparator<Universal>());
        for (Universal s : universalList) {
            System.out.println(s.getPrice());
        }
    }

}

Выход:

Showroom
5000
7000
8000
9000
Universal
44444
100000
222222
7055500

Примечание. Обязательно создайте установщик / получатель для атрибутов в универсальных и демонстрационных залах.

0 голосов
/ 07 июня 2019

Есть несколько способов, как вы могли бы подойти к этому.

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

interface Offer {

    String phoneVendor();

    int price();

    int ram();

    int storage();

}

class OfferComparator implements Comparator<Offering> {

    @Override
    public int compare(Offering o1, Offering o2) {
        // Compare
        return 0;
    }

}

Второй вариант будет ... вам действительно нужны оба этих класса, если они кажутся одинаковыми?Не могли бы вы обобщить его, дав ему атрибут type?Объединенный класс мог просто реализовать сравнимо.Как то так:

public class Offer implements Comparable<Offer> {

    enum Type {
        Showroom, Universal;
    }

    Type type;
    String phone_vendor;
    int price, ram, storage;

    public Showroom(String phone_vendor, int price, int ram, int storage) {
        this.phone_vendor = phone_vendor;
        this.price = price;
        this.ram = ram;
        this.storage = storage;
    }

    @Override
    public int compareTo(Offer o) {
        // Compare
        return 0;
    }

}
...