我想比较一系列可比数据。最简单的方法如下(详情未显示):
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
}
}
}
当然,这里的问题是,compareTo
中的itrNext.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)
和(int, string)
以及(string, double, string)
或任何您需要的内容编写可比较的内容。我只写一个,只要我确保类型匹配(我可以),我很高兴。
答案 0 :(得分: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();
}
}
答案 1 :(得分:3)
在当前使用Comparable
的任何地方使用原始类型Comparable<?>
都应该有效。实际上,如果你愿意,你可以在一个地方做到这一点:
if (((Comparable) itrNext).compareTo(l) == 0)
答案 2 :(得分:0)
试试这个:
if(itrNext.getClass().cast(itrNext).compareTo(l.getClass().cast(l))) {
//something
} else {
//other stuff
}
答案 3 :(得分: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);
}
}
答案 4 :(得分: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;
}
}