3

我想比较一系列可比对象。最简单的方法似乎如下(细节未显示):

public class ArrayComparable implements Comparable<ArrayComparable>{
ArrayList<Comparable<?>> list = new ArrayList<Comparable<?>>();

@Override
public int compareTo(ArrayComparable ac) {
    Iterator<Comparable<?>> itr = ac.list.iterator();
    for(Comparable<?> l : list) {
        Comparable<?> itrNext = itr.next();
        if(itrNext.getClass() == l.getClass()) {
            if(itrNext.compareTo(l)) {
                //something
            } else {
                //other stuff
            }
        } else {
            //some other thing
        }
    }
}

当然,这里的问题是compareToas initrNext.compareTo(l)将无法给出错误:The method compareTo(capture#6-of ?) in the type Comparable<capture#6-of ?> is not applicable for the arguments (Comparable<capture#7-of ?>) 我理解为什么(就方法而言,我可能将苹果与橙子进行比较)。另一方面,我知道我不是在比较它们之前检查事物的类别。

那么有没有办法让我完成这项工作?不要担心比较任何可比数组的合理性,因为我有充分的理由要这样做。

编辑-所以我为什么要做这样的事情。假设我想要一个可比较的数组,我不在乎每个索引中包含什么,只要类型对应,并且可以进行比较。然后我可以在这些数组之间进行一般的字典比较。这样我就不必为(int,int)and (int, string), and(string, double, string)或任何你需要的东西写一个可比较的。我只写一个,只要我确保类型匹配(我可以),我就可以了。

4

5 回答 5

3

创建一个泛型类,ArrayComparable以便您可以正确参数化泛型而不是<?>到处使用。哦,你也可以实施Iterable

public class ArrayComparable<T> implements Comparable<ArrayComparable<T>>, Iterable<T>
{
    List<Comparable<T>> list = new ArrayList<Comparable<T>>();

    @Override
    public int compareTo(ArrayComparable<T> ac)
    {
        // snip
    }

    @Override
    public Iterator<T> iterator()
    {
        return list.iterator();
    }
}
于 2011-04-22T18:42:53.353 回答
3

Comparable在您当前使用的任何地方使用原始类型Comparable<?>应该可以工作。实际上,如果您愿意,您可以在一个地方执行此操作:

if (((Comparable) itrNext).compareTo(l) == 0)
于 2011-04-22T18:48:16.623 回答
0

试试这个:

    if(itrNext.getClass().cast(itrNext).compareTo(l.getClass().cast(l))) {
        //something
    } else {
        //other stuff
    }
于 2011-04-22T18:45:12.967 回答
0
public class GenericDemo<T>{
  T g;
 public <T extends Comparable<T>> void printData(T a[]){
    T max = a[0];
    if(a[1].compareTo(max)>0){
        max=a[1];
    }
    if(a[2].compareTo(max)>0){
    max=a[1];
    }
    System.out.println(max);
    System.out.println("DataType: " +a.getClass().getName());

      }
    public static void main(String[] ar)
    {
     Integer a[]={1,2,3};
     Byte b[]= {4,6,7};
     Short c[]={6,8,9};

     GenericDemo g = new GenericDemo();
     g.printData(a);
     g.printData(b);
     g.printData(c);
     } 
}
于 2013-03-08T04:52:56.397 回答
0

一个很好的答案是:

public final class ArrayComparable<T extends Comparable<T>>
    implements Comparable<ArrayComparable<T>> {

    private final ArrayList<T> list = new ArrayList<>();

    @Override
    public int compareTo(final ArrayComparable<T> other) {

        final Iterator<T> it = other.list.iterator();

        for (final T element : list) {
            final T otherElement = it.next();

            final int comparison = element.compareTo(otherElement);
            if (comparison < 0) {
                // something
            } else if (comparison > 0) {
                // other stuff
            } else {
                // other stuff
            }
        }
        return 0;
    }
}
于 2016-02-16T12:15:36.653 回答