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)このようにして、 for 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<?>はずです。実際には、必要に応じて 1 か所で行うことができます。

if (((Comparable) itrNext).compareTo(l) == 0)
于 2011-04-22T18:48:16.623 に答える
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

これを試して:

    if(itrNext.getClass().cast(itrNext).compareTo(l.getClass().cast(l))) {
        //something
    } else {
        //other stuff
    }
于 2011-04-22T18:45:12.967 に答える