ArrayList通用分类器

时间:2013-08-17 22:55:37

标签: java

我想传递一个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;
      }

3 个答案:

答案 0 :(得分:3)

您的ArrayList混合了Stringchar个值。因此,当两者试图进行比较时,正在调用String的{​​{1}}方法。它的签名为compareTo,因此它会尝试将compareTo(String,String)转换为char。要么放入所有String,要么写一个自定义比较器来处理这样的混合类型。

答案 1 :(得分: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);
}

但我认为这会毫无用处。

答案 2 :(得分:0)

  

我想传递一个arraylist并对它进行排序,无论它是什么

这是什么意思?总排序是二元关系,它满足一些属性(反对称,传递性,总体性)。更容易的是,给定两个元素,您必须确定一个标准,以确定哪个小于/大于另一个。

除非你知道这些元素究竟是什么,否则你不能这样做。如果你想对任何一个数组进行排序,给定对象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;
}

编辑:如果您有兴趣对字符串和字符的列表进行排序(或者如果您想根据字符串表示对项目进行排序),那么正确的做法是将所有内容转换为字符串,或使用SortedMap<String, Object>。否则,您可以执行我之前向您展示的相同内容,但使用更具体的compare函数,例如:

public int compare(Object a, Object b) {
    return a.toString().compareTo(b.toString());
}