2012-04-23 4 views
0

У меня возникли проблемы с сортировкой массива, я хочу сортировать массив по дню, который может быть как в понедельник, во вторник, в среду, в четверг, так и в пятницу. У меня есть класс, который отображает все в массиве, но я хочу заказать это в предыдущие дни, как я могу это сделать?андроидный сортировочный массив

Я пробовал использовать collection.sort и Arrays.sort, но, похоже, не дал мне желаемого эффекта, никаких идей?

public void sortArray() { 



} 

04-23 12: 55: 49,010: Е/AndroidRuntime (281): неустранимые: Основной 04-23 12: 55: 49,010: Е/AndroidRuntime (281): java.lang.RuntimeException: Не удалось запустить Activity ComponentInfo {org.assignment.timetable/org.assignment.timetable.Timetable}: java.lang.NullPointerException 04-23 12: 55: 49.010: E/AndroidRuntime (281): at android.app.ActivityThread. performLaunchActivity (ActivityThread.java:2663) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at android.app.ActivityThread.access $ 2300 (ActivityThread.java:125) 04-23 12 : 55: 49.010: E/AndroidRuntime (281): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033) 04-23 12: 55: 49.010: E/AndroidRuntime (281): на android.os .Handler.dispatchMessage (Handler.java:99) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at android.os.Looper.loop (Looper.java:123) 04-23 12:55 : 49.010: E/AndroidRuntime (281): at android.app.ActivityThread.main (ActivityThread.java:4627) 04-23 12: 55: 49.010: E/AndroidRuntime (281): на java.lang.reflect.Method .invokeNative (собственный метод) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at java.lang.reflect.Method.invoke (Method.java:521) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868) 04-23 12: 55: 49.010: E/AndroidRuntime (281): на com.android. ИНТ ernal.os.ZygoteInit.main (ZygoteInit.java:626) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at dalvik.system.NativeStart.main (родной метод) 04-23 12:55 : 49.010: E/AndroidRuntime (281): Caused by: java.lang.NullPointerException 04-23 12: 55: 49.010: E/AndroidRuntime (281): at org.assignment.timetable.Timetable $ MyComparator.compare (расписание. java: 51) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at org.assignment.timetable.Timetable $ MyComparator.compare (Timetable.java:1) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at java.util.TimSort.countRunAndMakeAscending (TimSort.java:320) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at java.util.TimSort.sort (TimSort. java: 185) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at java.util.TimSort.sort (TimSort.java:169) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at java.util.Arrays.sort (Arrays.java:1907) 04-23 12: 55: 49.010: E/AndroidRuntime (281): в java .util.Collections.sort (Collections.java:1972) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at org.assignment.timetable.Timetable.sortModules (Timetable.java:71) 04- 23 12: 55: 49.010: E/AndroidRuntime (281): at org.assignment.timetable.Timetable.onCreate (Timetable.java:40) 04-23 12: 55: 49.010: E/AndroidRuntime (281): у android .app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 04-23 12: 55: 49.010: E/AndroidRuntime (281): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627) 04-23 12 : 55: 49.010: E/AndroidRuntime (281): ... 11 далее

+4

используйте Arrays.sort() в своем массиве и создайте свой собственный компаратор. – Jave

+0

- это их учебники по этому вопросу? – mitchnufc

+0

Google - ваш друг, вот один пример создания компаратора: http://www.vogella.com/blog/2009/08/04/collections-sort-java/ Я тоже буду кратким примером , – Jave

ответ

1
public WeekComparator implements Comparator { 
private String[] weeksdays = {"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}; 
public int compare(Object o1, Object o2) { 
    if(!(o1 instanceof String && o2 instanceof String)) { 
    throw new ClassCastException(); 
    } 
    int day1 = indexOfDay((String)o1); 
    int day2 = indexOfDay((String)o2); 
    if(day1==day2) return 0; 
    return (day1>day2 ? 1 : -1); 
} 

private int indexOfDay(String s) { 
    for(int i = 0 ; i < weekdays.length;i++) { 
    if(weekdays[i].equalsIgnoreCase(s)) return i; 
    return 10; 
} 

Я не проверял это, но должен работать .. на бумаге (э ...экран)

2

Вот пример:

//Assuming that the Module-class has the day stored as a String named "day" 
static class MyComparator implements Comparator<Module>{ 
    private final static HashMap<String, Integer> order = getMap(); 

    @Override 
    public int compare(Module lhs, Module rhs){ 
     int leftOrder = order.get(lhs.day.toLowerCase()); 
     int rightOrder = order.get(rhs.day.toLowerCase()); 
     return leftOrder - rightOrder; 
    } 

    private final static HashMap<String, Integer> getMap(){ 
     HashMap<String, Integer> res = new HashMap<String, Integer>(); 
     res.put("monday",0); 
     res.put("tuesday",1); 
     res.put("wednesday",2); 
     res.put("thursday",3); 
     res.put("friday",4); 

     return res; 
    } 
} 

И когда вы создали массив (любой, как вы хотите) вы можете сортировать его следующим образом:

Arrays.sort(myArray, new MyComparator()); 

Или, если у вас есть список:

Collections.sort(myList, new MyComparator()); 

Элементы в массиве теперь будут отсортированы.

+0

, это делается как внутренний класс? – mitchnufc

+0

Я сделал это как внутренний класс, но технически его можно было определить где угодно. – Jave

+0

Получение этой ошибки, и мне пришлось удалить переопределение в MyComparator: метод sort (T [], Comparator ) в типе Arrays не применим для аргументов (ArrayList , Timetable.MyComparator) – mitchnufc

Смежные вопросы