如何从通用arraylist中找到最小值?

时间:2014-04-17 06:05:50

标签: java generics arraylist min

我在尝试编写方法以返回通用ArrayList中具有最小音量的对象时遇到问题。这些是我编写代码的指导原则:

分钟() - 此方法采用有界通用类型的ArrayList,它只允许Shape对象及其子类。 - 该方法应返回对象列表中具有最小体积的对象。

但我还不完全确定我是否正确地遵循了它。有没有办法可以使用Collections.min(和Collections.max,因为我也必须编写最大卷方法)?我得到一个绑定不匹配错误说:类型集合的泛型方法min(Collection)不适用于参数(ArrayList)。推断类型Shape不是有界参数>

的有效替代

我的Shape类只是一个带有getVolume()的接口;我的其他类(Spheres,Ellipsoids等)覆盖此方法的方法:

public interface Shape {
    public double getVolume();
}

这是我的min方法(在另一个类中使用其他方法)我遇到了以下问题:

public static <T> T  min() {
    ArrayList<? extends Shape> list;    

     T min = Collections.min(list));
        return min;

5 个答案:

答案 0 :(得分:1)

java.utils.Collections中有两个选项。

  • static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
  • static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)

第一个要求你的Shape实现Comparator<Shape>

class Shape implements Comparable<Shape> {
    int compareTo(Shape other) {
       return Math.signum(getVolume()-other.getVolume);
    }
    ...
}

ArrayList<Shape> myShapes = ...
Shape minShape = Collections.min(myShapes);

第二个要求您创建自定义比较器:

class Shape {
    ...
}

class ShapeVolumeComparator implements Comparator<Shape> {
    int compare(Shape s1, Shapes2) {
       return Math.signum(s1.getVolume()-s2.getVolume());
    }
}

ArrayList<Shape> myShapes = ...;
Shape minShape = Collections.min(myShapes, new ShapeVolumeComparator() );

第一种是较少的代码,但如果你想对其他东西进行排序(比如表面区域或位置),则第二种代码更具适应性。

答案 1 :(得分:1)

要比较音量,您可以使形状可比较或使用比较器。

可比

这需要更改所有形状,但不需要使用它们的代码。我使用了一个抽象类来轻松地将比较放到所有类中。

public interface Shape extends Comparable<Shape> {
    public double getVolume();
}

public abstract class BaseShape implements Shape {
    public int compareTo(Shape other) {
        return Double.compare(getVolume(), other.getVolume());
    }
} 

public class Box extends BaseShape {
    public double getVolume() {
        return volume;
    } 
} 
public class Ball extends BaseShape { /* ... */ } 

使用:

Collections.min(collection);

比较

这不需要修改形状,而是需要更多代码来使用它们。

public class ShapeComparator implements Comparator<Shape> {
    public int compare(Shape a, Shape b) {
        return Double.compare(a.getVolume(), b.getVolume());
    } 
} 

使用:

Collections.min(collection, new ShapeComparator());

答案 2 :(得分:0)

因为Java在运行时擦除了类型,所以Collection并不知道它实际处理的是什么类型。在使用Java泛型时这是一个限制因素 - 几年前我已经碰到了它,但我无法找到解决问题的方法,结果证明这是一种语言限制

最好的办法是创建一个public T getMinVolume(ArrayList<T> list)方法来遍历每个T。

例如

public T getMinVolume(ArrayList<T> list) {
    T min = null;
    for(T item: list) {
        if (min == null) {
            min = item;
        }

        if (min > item) {
            min = item;
        }
    }

    return min;
}

类似的东西,我的Java有点生疏,但逻辑应该有用。

答案 3 :(得分:0)

public <E extends Comparable> E getMin(List<E> list){
    E min = null;
    for(E element:list){
        if(min == null){
            min = element;
            continue;
        }
        if(element.compareTo(min) < 0){
            min = element;
        }
    }
    return min;
}

答案 4 :(得分:-1)

您应该使用此方法http://www.tutorialspoint.com/java/util/collections_min_comparator.htm并提供比较器:

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

public abstract class Shape {
    public abstract double getVolume();

    public Shape min(Collection<? extends Shape> col) {
        return Collections.min(col, new Comparator<Shape> () {
            public int compare(Shape l, Shape r) {
                return ((Double) l.getVolume()).compareTo(r.getVolume());
            }
        });
    }
}