Сортировка ArrayList объектов JSONObject по двойнику не работает

В настоящее время я создаю приложение для Android для школы, но все еще хочу выкладываться на полную. Я новичок в разработке и программировании под Android в целом. Приложение должно быть игрой на фондовом рынке. (Кстати, я немец, поэтому могут быть некоторые немецкие переменные) Итак, я хочу отсортировать свой RecyclerView, содержащий общие ресурсы. Он работает по алфавиту, но не по ценности. Я могу гарантировать, что имя "worth" двойника в JSONObject правильное. Что я делаю не так?

public class CompanyAdapter extends RecyclerView.Adapter<CompanyAdapter.viewHolder> implements Filterable {

    private CustomFilter filter;
    private ArrayList<JSONObject> jObjList;
    private final String keyName;
    private final String keyWorth;
    private final String keyChange;

    public final static int SORT_ALPHABETICALLY = 0;
    public final static int SORT_ALPHABETICALLY_REVERSE = 1;
    public final static int SORT_BY_WORTH = 2;
    public final static int SORT_BY_WORTH_REVERSE = 3;

    public CompanyAdapter(Context context, ArrayList<JSONObject> jObjList) {
        this.jObjList = jObjList;
        Context c = context;

        keyName = c.getResources().getString(R.string.nameCompany);
        keyWorth = c.getResources().getString(R.string.worthCompany);
        keyChange = c.getResources().getString(R.string.changeCompany);

        sort(SORT_ALPHABETICALLY);
    }

    //left out some unnecessary code

    public void sort (int sorting) {
        if (jObjList.size()>1) {
            switch (sorting) {
                case SORT_ALPHABETICALLY:
                    sortAlphabetically();
                    break;

                case SORT_ALPHABETICALLY_REVERSE:
                    sortAlphabeticallyReverse();
                    break;

                case SORT_BY_WORTH:
                    sortByWorth();
                    break;

                case SORT_BY_WORTH_REVERSE:
                    sortByWorthReverse();
                    break;
            }
        }
    }

    private void sortAlphabetically () {
        Collections.sort(jObjList, new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject j1, JSONObject j2) {
                try {
                    return j1.getString(keyName).compareToIgnoreCase(j2.getString(keyName));
                } catch (JSONException e) {
                    return 0;
                }
            }
        });
    }

    private void sortAlphabeticallyReverse () {
        sortAlphabetically();
        Collections.reverse(jObjList);
    }

    private void sortByWorth () {
        Collections.sort(jObjList, new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject j1, JSONObject j2) {
                try {
                    return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));
                } catch (JSONException e) {
                    Log.e("JSONException", e.getMessage());
                    return 0;
                }
            }
        });
    }

    private void sortByWorthReverse () {
        sortByWorth();
        Collections.reverse(jObjList);
    }
}
0
0
27
4

Ответы 4

Вы проверили значения сравниваемых объектов в консоли?

Поскольку вы читаете значения в виде строки, возможно, они не дадут ожидаемого результата.

Кроме того, какую операцию выполняет функция сравнения?

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

Chrobin 22.08.2018 00:21

Заменять:

return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));

В методе sortByWorth:

return j1.getDouble(keyWorth).compareTo(j2.getDouble(keyWorth))

Попробуй..

Обычный double не имеет метода compareTo. Это строковый метод. Стоит ли попробовать преобразовать двойные в парные?

Chrobin 22.08.2018 00:22

Вы попробуете что-то вроде этого: Double double1 = new Double (1.1); Double double2 = новый Double ("1,2"); double1.compareTo (double2);

Ümañg ßürmån 22.08.2018 00:27

попытаться заменить

return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));

с

System.out.print("VALUE1: "+j1.getDouble(keyWorth));
System.out.print("VALUE2: "+j2.getDouble(keyWorth));
    return (int)(j1.getDouble(keyWorth)-j2.getDouble(keyWorth));

а также, чтобы убедиться и отладить значение, напечатайте его.

и после sortByWorth();

добавить notifyDataSetChanged();

Он печатает правильные значения, но все равно не работает.

Chrobin 22.08.2018 10:45

Я отредактировал комментарий, Вы использовали notifyDataSetChanged (); ?

Momen Zaqout 22.08.2018 13:01

Я забыл notifyDataSetChanged(). Извините, это глупая ошибка.

Другие вопросы по теме