有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过泛型属性的属性对对象进行排序

假设我有这门课:

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


共 (1) 个答案

  1. # 1 楼答案

    假设这是一个理论问题,我不建议你去实现它,而是要找到一个更好的模式去做你想做的事情

    您要对存储桶列表进行排序。呼叫集合。sort()方法,Bucket需要实现Comparable(因此要定义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;
        }
    }
    

    现在您可以定义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
    

    真丢脸,我写了整个代码,但阅读这段代码要比阅读我能写的糟糕解释更容易理解