-1

我想传入一个数组列表并对其进行排序,无论其中有什么错误我得到:线程“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有一个混合Stringchar价值观。因此,当两者尝试进行比较时,将调用String'compareTo方法。它的签名为compareTo(String,String),因此它试图将char转换为String。要么把所有String的 s 都放进去,要么写一个自定义的比较器来处理这样的混合类型。

于 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

我想传入一个数组列表并对其进行排序,无论其中有什么

这是什么意思?全序是满足某些性质(反对称性、传递性、整体性)的二元关系。更容易的是,给定两个元素,您必须确定一个标准来确定哪个比另一个更小/更大。

你不能这样做,除非你知道这些元素实际上是什么。如果你想对一个数组进行排序,给定对象 A 和 B,你甚至不知道它们的类型,你怎么知道哪个比另一个大?

在 Java 中,您可能会使用 hashCode,这确实是一个标准,但它几乎没有用处。如果要避免重复,可以使用 aSet而不是 a 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());
}
于 2013-08-17T23:38:38.217 回答