2013-11-15 152 views
-2
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Comparable 
at java.util.Collections.sort(Collections.java:121) 
at day3.collections.SortArrayList.SortArrayList.main(SortArrayList.java:20) 

package day3.collections.arraylist; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class ArrayListMain { 

private ArrayList a; 

public void demo(){ 

    try{ 

     System.out.println("enter the no to add in the array list"); 
     Scanner in = new Scanner(System.in); 

     int digitno = in.nextInt(); 
     int numbers[] = new int[digitno]; 

     Scanner sc=new Scanner(System.in); 
     System.out.println("Please enter numbers..."); 
     ArrayList arrayList1 = new ArrayList(); 



    for(
      int j=0;j<digitno;j++){ 
      numbers[j]=sc.nextInt(); 
      arrayList1.add(numbers[j]); 
      setA(arrayList1); 
     } 

    } 
    catch(IndexOutOfBoundsException e){ 
     System.out.println("Error: Entered number is not found"); 
    } 

    catch(Exception e){ 
     System.out.println("Error: Please enter integer values only"); 

    } 

} 

public ArrayList getA() { 
    return a; 
} 

public void setA(ArrayList a) { 
    this.a = a; 
} 

} 



package day3.collections.SortArrayList; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 

import day3.collections.arraylist.ArrayListMain; 

public class SortArrayList extends ArrayListMain { 

public static void main(String[] args) { 


    ArrayListMain arrayList=new ArrayListMain(); 
    ArrayList arrayL=new ArrayList(); 
    arrayList.demo(); 
    arrayL.add(arrayList.getA()); 


Collections.sort(arrayL); 


System.out.println("ArrayList elements after sorting in ascending order : "); 
for(int i=0; i<arrayL.size(); i++) 
    System.out.println(arrayL.get(i)); 

} 
} 
+0

ArrayList的是收藏,爲什麼你需要排序ArrayList? – Masudul

+6

你知道你想排序的數組列表包含另一個數組列表嗎? – SudoRahul

+0

ArrayListMain中的ArrayList是如何進行比較的? 'ArrayLists'並不是自然可比的。您應該添加參數括號,以便您可以看到您正在嘗試執行的操作。 –

回答

1

arrayL.add(arrayList.getA());應該arrayL.addAll(arrayList.getA());

更改像下面

ArrayListMain arrayList=new ArrayListMain(); 
ArrayList arrayL=new ArrayList(); 
arrayList.demo(); 
arrayL.addAll(arrayList.getA()); 
      ^___here is the change 

ArrayList中沒有實現Comparable接口的代碼。

public class ArrayList<E> extends AbstractList<E> 
     implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ 

} 

Collections.sort();將根據Comparable intefface的compareTo方法進行排序。

public interface Comparable<T> { 

    public int compareTo(T o); 
} 

查看String類的語法並實現了Comparable接口。

public final class String 
    implements java.io.Serializable, Comparable<String>, CharSequence 
{ 
     public int compareTo(String anotherString) { 
     } 
} 

arrayL.add(arrayList.getA());等於

ArrayList<String> a= new ArrayList<String>(); 
a.add("A"); 
a.add("B"); 
a.add("C"); 
a.add("D"); 
arrayL.add(a); 

arrayL包含一個ArrayList對象和其沒有實現可比接口所以它不能排序(添加的ArrayList本身arrayL)。

arrayL.addAll(arrayList.getA());等於

ArrayList<String> a= new ArrayList<String>(); 
a.add("A"); 
a.add("B"); 
a.add("C"); 
a.add("D"); 
arrayL.addAll(a); 

arrayL包含一個4字符串對象和其實現的可比接口所以它能夠分揀(添加的ArrayList值arrayL)。

+0

我可以知道差異爲何出現此錯誤... – user2996028

0

儘量使arraL列表,並添加您的ArrayList中的所有元素。所以:

List<WhateverTypeYouNeed> arrayL = new ArrayList<WhateverTypeYouNeed>(); 
arrayL.addAll(arrayList.getA()); 
Collections.sort(arrayL); 
0

你把的ArrayList一個實例到另一個ArrayList,然後進行排序後者。按此方式排序需要所有元素爲Comparable,但由於ArrayList不是Comparable,因此您的代碼將失敗。

它認爲這個問題是在行:

arrayL.add(arrayList.getA()); 

它可能應該是:

arrayL.addAll(arrayList.getA()); 

順便說一句。:可怕的格式和命名!考慮重新設計!