-1

arraylist を渡して、その内容に関係なく並べ替えたい エラーが発生しています: スレッド "main" での例外 java.lang.ClassCastException: java.lang.String を java.lang.Character にキャストできません

  ArrayList myArray = new ArrayList();
        myArray.add("wayne");
        myArray.add("bob");
        myArray.add('h');
        myArray.add(4);
        myArray.add(5.50);
       ArrayList sortedArray =   Validate.Sort(myArray);

       for(Object x:  sortedArray)
       {
           System.out.println(x);
       }

 public static ArrayList Sort(ArrayList value)
      {


          Collections.sort(value);

          return value;
      }
4

3 に答える 3

3

あなたにはとの値ArrayListが混在しています。したがって、2 つを比較しようとすると、のメソッドが呼び出されます。の署名があるため、 を にキャストしようとしています。すべての s を入れるか、このような混合型を処理するカスタム コンパレータを記述します。StringcharStringcompareTocompareTo(String,String)charStringString

于 2013-08-17T22:58:18.437 に答える
0

コンパレータを見てください:

http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

あなたの場合、次のcompareTo()ようになります。

public int compareTo(Object a, Object b){
    if(a == b)
       return 0;
    if(a==null)
       return 1;
    if(b==null)
        return -1;
    return a.toString().compareTo(b.toString);
}

でも、これはちょっと駄目だろうと思います。

于 2013-08-17T23:38:31.693 に答える
0

配列リストを渡して、何が入っていても並べ替えたい

これはどういう意味ですか?全順序付けは、いくつかの特性 (反対称性、推移性、全体性) を満たす二項関係です。もっと簡単に言えば、2 つの要素が与えられた場合、どちらが他方よりも小さいか大きいかを判断する基準を特定する必要があります。

これらの要素が実際に何であるかを知らなければ、これを行うことはできません。オブジェクト A と B が与えられたときに、その型がわからないものの配列をソートしたい場合、どちらが他方よりも大きいかをどのように判断できますか?

Java では、hashCode を使用できますが、これは確かに基準ですが、ほとんど役に立ちません。重複を避けたい場合は、Setではなくを使用できますList。とにかく、hashCode に基づいて要素を並べ替えたい場合は、次のようにできます。

private static final Comparator<Object> hashComparator
        = new Comparator<Object>() {
    @Override
    public int compare(Object a, Object b) {
        return System.identityHashCode(a) - System.identityHashCode(b);
    }

    @Override
    public boolean equals(Object obj) {
        //this is a static singleton, nothing can be equal to it
        return false;
    }
};

public static ArrayList Sort(ArrayList value)
{
    Collections.sort(value, hashComparator);
    return value;
}

EDIT : 文字列と文字のみのリストをソートすることに関心がある場合 (または、文字列表現に基づいてアイテムをソートする場合) は、おそらくすべてを文字列に変換するか、SortedMap<String, Object>. それ以外の場合は、前に示したのと同じことを行うことができますが、次のcompareようなより具体的な関数を使用します。

public int compare(Object a, Object b) {
    return a.toString().compareTo(b.toString());
}
于 2013-08-17T23:38:38.217 に答える