Получение подмножества из TreeSet пользовательских объектов с пользовательским компаратором - PullRequest
0 голосов
/ 24 октября 2018

У меня проблема с операцией, которую я пытаюсь выполнить в Java с помощью класса TreeSet.У меня есть класс с моим пользовательским объектом, вот код:

package soluzione;

class Building_event {

    //campi
    private String type;
    private int y;
    private String p;
    private String l;
    private int d;
    private int b;
    private int h;
    private int lateral_profile;

    //costruttore build
    public Building_event(String type,int y, String p, String l, int d, int b, int h) {
        this.type = type;
        this.y = y;
        this.p = p;
        this.l = l;
        this.d = d;
        this.b = b;
        this.h = h;
        this.lateral_profile = b + d;
    }

    //costruttore demolish
    public Building_event(String type, int y, String p) {
        this.type = type;
        this.y = y;
        this.p = p;
        }

    //setter e getter
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public String getP() {
        return p;
    }
    public void setP(String p) {
        this.p = p;
    }
    public String getL() {
        return l;
    }
    public void setL(String l) {
        this.l = l;
    }
    public int getD() {
        return d;
    }
    public void setD(int d) {
        this.d = d;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public int getH() {
        return h;
    }
    public void setH(int h) {
        this.h = h;
    }
    public int getLateral_profile() {
        return lateral_profile;
    }
    public void setLateral_profile(int lateral_profile) {
        this.lateral_profile = lateral_profile;
    }
    public String getType() {
        return type;
    }

    public void setType (String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        String res = "";
        if (type.equals("build")) {
             res = "Building_event [type=" + type + ", y=" + y + ", p=" + p + ", l=" + l + ", d=" + d + ", b=" + b + ", h="
                    + h + ", lateral_profile=" + lateral_profile + "]";}
        else if (type.equals("demolish")) {
            res = "Building_event [type=" + type + ", y=" + y + ", p=" + p  + "]";
        }
        return res;
    }
}

Я также написал метод, который строит деревья с помощью специального компаратора:

public class LateralProfileComp implements Comparator<Building_event> {

    @Override
    public int compare(Building_event b1, Building_event b2) {
        if (b1.getLateral_profile() >= b2.getLateral_profile())
            return 1;
        else if (b1.getLateral_profile() < b2.getLateral_profile())
            return -1;
        else return 0;
    }

}

Деревопостроен правильно, но мой вопрос: поскольку я упорядочил свои элементы в дереве в соответствии с lateral_profile, как я могу получить подмножество элементов, у которых lateral_profile больше определенного значения, которое я указываю?Я знаю, что класс TreeSet имеет методы подмножества рекламных наборов, но для сравнения требуется элемент.Должен ли я создать элемент исключительно для этой цели?Спасибо в andvance.

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете создать интерфейс LateralProfile, и TreeSet и компаратор примут любой экземпляр LateralProfile, что позволит вам создать более простой экземпляр ConstantLateralProfile с постоянным боковым профилем для поиска.

Примерно так будет работать:

import java.util.*;

interface LateralProfile {
    public int getLateral_profile();
}

class Building_event implements LateralProfile {
    public int getLateral_profile() {
        return 123; // or whatever complicated calculation…
    }
}

class ConstantLateralProfile implements LateralProfile {
    private int lateral_profile;

    ConstantLateralProfile(int lateral_profile) { 
        this.lateral_profile = lateral_profile; 
    }

    public int getLateral_profile() { 
        return lateral_profile; 
    }
}

class LateralProfileComp implements Comparator<LateralProfile> {
    @Override
    public int compare(LateralProfile lp1, LateralProfile lp2) {
        if (lp1.getLateral_profile() >= lp2.getLateral_profile())
            return 1;
        else if (lp2.getLateral_profile() < lp1.getLateral_profile())
            return -1;
        else
            return 0;
    }
}

public class Main {

    public static void main(String[] args) {
        var set = new TreeSet<LateralProfile>(new LateralProfileComp());
        set.add(new Building_event());
        System.out.println("grater than 123 lateral profile: " + set.tailSet(new ConstantLateralProfile(123)));
    }
}
...