我在尝试编写方法以返回通用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;
答案 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());
}
});
}
}