java - 按通用属性的属性对对象进行排序

标签 java generics compare

假设我有这个类(class):

public class Bucket<T> {
        T filling;
}

填充属性可以是以下任一属性的实例:

public class Oil{
    float volume;
}

public class Water{
    float volume;
}

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

LinkedList<Bucket> list;

现在,我想通过属性“volume”对“list”(Bucket)中的元素进行排序。 但我无法比较 T.volume。那么,我该怎么做呢?

如果我的问题很愚蠢,提前抱歉,我还在学习java。

最佳答案

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

您想要对存储桶列表进行排序。为了调用Collections.sort()方法,Bucket需要实现Comparable(因此定义compareTo方法)。

您应该定义一个由“填充”元素实现的接口(interface)

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;
    }
}

现在您可以定义 Bucket 类:

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

真丢人的是,我写了整个代码,但是阅读这段代码比阅读我可以写的糟糕解释更容易理解。

关于java - 按通用属性的属性对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21339745/

相关文章:

vb.net - 如何只比较日期部分而不是两个日期的时间?

c++ - 如何在C++中将文件内容读入字符串

java - java和c++中的实例变量

java - 如何使用 JSTL 启动静态函数?如何读取字符串?

swift - 存储通用类型的项目

java - 为什么 Object.to string 对于 List 类型返回 true

c# - 创建泛型类的实例 C#

java - 在使用 wsdl2java 创建 Web 服务客户端并使用它之后,我得到了 Unexpected Attachment type =class

java - HTML 中的 Swing 组件

字符数组和指针如何使用strtok和strcmp