【问题标题】:Sorting ArrayList of JSONObjects by a double doesn't work按双精度对 JSONObjects 的 ArrayList 进行排序不起作用
【发布时间】:2018-08-21 21:58:20
【问题描述】:

我目前正在为学校创建一个 Android 应用,但仍想尽我所能。 一般来说,我对 Android 开发和编码还是很陌生。该应用程序应该是一个股票市场游戏。 (顺便说一句,我是德国人,所以可能会有一些德国变量) 所以我想对包含共享的 RecyclerView 进行排序。它按字母顺序工作,但不是按价值。 我可以保证JSONObject中double的名称"worth"是正确的。我做错了什么?

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

【问题讨论】:

    标签: android sorting android-recyclerview


    【解决方案1】:

    您是否检查过您在控制台中比较的对象的值?

    由于您将值作为字符串读取,因此它们可能不会给出您期望的结果。

    另外,比较函数执行的是什么操作?

    【讨论】:

    • 我已经检查了值,如果这就是你的意思,回收站确实没有排序。你在说什么价值观?你可以在代码中看到它。
    【解决方案2】:

    替换:

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

    在 sortByWorth 方法中,到:

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

    试试吧..

    【讨论】:

    • 普通的double没有compareTo方法。那是字符串的方法。我应该尝试将双打转换为双打吗?
    • 你试试这样:Double double1 = new Double(1.1); Double double2 = new Double("1.2"); double1.compareTo(double2);
    【解决方案3】:

    我忘记了notifyDataSetChanged()。抱歉,这是一个愚蠢的错误。

    【讨论】:

      【解决方案4】:

      尝试替换

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

      【讨论】:

      • 打印的是正确的值,但还是不行。
      • 我编辑了评论,你使用 notifyDataSetChanged(); ?
      猜你喜欢
      • 2012-11-06
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多