2013-08-17 2 views
-1

Я хочу передать в arraylist и отсортировать его независимо от того, что в нем Ошибка Я получаю: Исключение в потоке «main» java.lang.ClassCastException: java.lang.String нельзя отбрасывать в java. lang.CharacterArrayList Generic Sorter

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; 
     } 
+0

Там нет такой сортировки по умолчанию, вы должны определить свои собственные. –

+0

Просто заметьте, вы можете просто сделать 'Collections.sort (value)', возвращая 'List' бессмысленно, потому что' Collections.sort (value) 'уже будет изменять элементы в вашей' Collection'. –

ответ

3

Ваш ArrayList имеет сочетание String и char значений. Поэтому, когда эти два пытаются сравниться, вызывается метод StringcompareTo. У него есть подпись compareTo(String,String), поэтому он пытается отличить char до String. Либо поместите все String s, либо напишите собственный компаратор, который обрабатывает смешанные типы, подобные этому.

+2

И используйте общие для типов 'List'; их цель заключается в предотвращении такого рода ошибок. – chrylis

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); 
} 

Но я думаю, что это будет своего рода бесполезно.

0

Я хочу передать в ArrayList и не сортировать его, независимо от того, что там в это

Что это должно означать? Полное упорядочение является бинарным отношением, которое удовлетворяет некоторым свойствам (антисимметрия, транзитивность, тотальность). Легче, учитывая два элемента, вы должны определить критерий для определения, который меньше/больше другого.

Вы не можете этого сделать, если не знаете, что представляют собой эти элементы. Если вы хотите отсортировать массив любого объекта A и B, типы которого вы даже не знаете, как вы можете определить, что больше, чем другое?

В Java вы можете использовать hashCode, который действительно является критерием, но это вряд ли полезно. Если вы хотите избежать дубликатов, вы можете использовать Set, а не List. Во всяком случае, если вы действительно хотите, чтобы сортировать элементы на основе их хэш-код, вы можете сделать это следующим образом:

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()); 
}