在通用ArrayList中查找最小值

时间:2015-10-11 17:49:13

标签: java generics arraylist max min

我不断收到一条消息,告诉我类型为<的运算符T,T未定义。这种情况正在发生

if(index<lowest)

我如何修改程序以便使用通用方法获取数组列表的最小值和最大值?

package p07;

import java.util.ArrayList;

public class MyList<T extends Number> {
    private ArrayList<T> l;

    public MyList(ArrayList<T> l) {
        this.l=l;
    }
    public void add(T x) {
        l.add(x);
    }
    public static <T> void smallest(ArrayList<T> l) {
        T lowest=l.get(0);
        for(T index:l) {
            if(index<lowest) { 

            }
        }   
    }
}

2 个答案:

答案 0 :(得分:-1)

编译器是正确的:运算符<仅适用于原始数字类型。引用JLS的section 15.20.1

  

数值比较运算符的每个操作数的类型必须是可转换(第5.1.8节)到基本数字类型的类型,否则会发生编译时错误。

因此,它没有为Objects定义,甚至没有为Numbers定义,因为它们不能拆箱到原始类型:JLS的section 5.1.8

  

如果类型是数字类型(§4.2),则称该类型可转换为数字类型,或者它是可通过拆箱转换转换为数字类型的引用类型。

您需要的是使用Comparator或制作对象ComparableComparator负责比较两个相同类型的对象。由于此处的对象是Numbers,而且它们不是Comparable,因此您需要使用自定义Comparator,如下所示:

Comparator<Number> myComparator = new Comparator<Number>() {
    @Override
    public int compareTo(Number n1, Number n2) {
        // implement logic here.
        // Return -1 if n1 < n2, 0 if n1 = n2, 1 if n1 > n2
    }
};

然后你可以像这样使用这个比较器:

public static <T extends Number> T smallest(List<T> l) {
    T lowest = l.get(0);
    for (T index : l) {
        if (myComparator.compareTo(index, lowest) < 0) { 
            index = lowest;
        }
    }
    return lowest;
}

(请注意,我将T extends Number添加到方法的类型中 - 这是因为该方法是静态的,因此它实际上声明了另一个类T,即该类的类型。)

答案 1 :(得分:-1)

这里有几件事情,但是让我们从低调的语法水果开始。

算术运算符适用于原始值,T非常Object,因此您无法在此处使用它们。< / p>

您的语法的另一个细微差别在于,您T的静态函数 T不一样 是你的班级。

你可以通过自己添加绑定来解决这个问题......

public static <T extends Number> void smallest(ArrayList<T> l)

...但这引出了我的问题,为什么你想让这种方法保持静态呢?

您使用参数l模糊了字段l的名称,因此您可能会认为这对于提供的实例{{1因为方法本身被声明为l,所以它不会被激活,如果它不是,那么你仍然会隐藏该字段的名称。

您应该从该方法中删除static,并从该函数中删除该参数。

static

但是现在,您遇到了一个问题,即您实际上返回最小值是什么。你应该把它归还而不是什么:

public void smallest() {}

如果您能够排序,从阵列中获取最后一个值很简单。您只需要确保所有元素都是public T smallest() {} ,以便对它们进行排序,以及您最关心的值 - 例如ComparableIntegerDoubleFloat - 是。

Long

如果你可以排序,那么最小的是直截了当

public class MyList<T extends Number & Comparable<T>> {}

通过这种方法获得最高价值,我将此作为练习留给读者。