通过通用属性的属性订购对象



说我有这个类:

public class Bucket<T> {
        T filling;
}

和填充属性可以是其中任何一个的实例:

public class Oil{
    float volume;
}

public class Water{
    float volume;
}

在我的代码的一部分中,我有一个列表:

LinkedList<Bucket> list;

现在,我想通过属性"卷"订购"列表"(buccet)的元素。但是我无法比较T.volume。那么,我该怎么做?

对不起,如果我的问题很愚蠢,我仍在学习java。

我回答你,假设这是一个理论问题,我不建议您实施它,而要找到一个更好的模式来完成您想要的事情。

您想对存储桶的列表进行排序。要调用collections.sort()方法,存储桶需要实现可比(以及定义compareTo方法)。

您应该定义"填充"元素实现的接口

interface Element {
    float getVolume();
    void setVolume(float volume);
}
class Oil implements Element {
    float volume;
    @Override
    public float getVolume() {
        return volume;
    }
    @Override
    public void setVolume(float volume) {
        this.volume = volume;
    }
}
class Water implements Element {
    float volume;
    @Override
    public float getVolume() {
        return volume;
    }
    @Override
    public void setVolume(float volume) {
        this.volume = volume;
    }
}

现在您可以定义存储桶类:

class Bucket implements Comparable<Bucket> {
    Element filling;
    @Override
    public int compareTo(Bucket o) {
        return Float.compare(filling.getVolume(), o.filling.getVolume());
    }
}

和此代码:

public static void main(String[] args) {
    List<Bucket> elems = new LinkedList<>();
    Bucket o = new Bucket();
    o.filling = new Oil();
    o.filling.setVolume(5);
    Bucket w = new Bucket();
    w.filling = new Water();
    w.filling.setVolume(12);
    elems.add(w);
    elems.add(o);
    Collections.sort(elems);
    for(Bucket b: elems) {
        System.out.println(b.filling.getVolume());
    }
}

将打印:

5.0
12.0

我写了整个代码,让我感到羞耻,但是通过阅读这本书比阅读我可以写的不良解释更容易理解。

相关内容

  • 没有找到相关文章

最新更新