Android如何对JSONObjects的JSONArray进行排序

2023-12-25

我制作了一个 jsonobjects 的 jsonarray 。现在我需要根据 jsonobjects 中的值对 JSONArray 进行排序。以前我对自定义对象的 ArrayList 进行排序,如下所示:

比较器:

public class KreeftenComparatorLA implements Comparator<Kreeft> {
    public int compare(Kreeft left, Kreeft right) {
        return left.latijnseNaam.compareTo(right.latijnseNaam);
    }
}
public class KreeftenComparatorNL implements Comparator<Kreeft> {
    public int compare(Kreeft left, Kreeft right) {
        return left.naam.compareTo(right.naam);
    }
}

然后对数组列表进行排序:

Collections.sort(db.lijst, new KreeftenComparatorLA());

or:

Collections.sort(db.lijst, new KreeftenComparatorNL());

但是当我尝试使用像这样的 JSONArray 做同样的事情时(JA = my jsonarray)

Collections.sort(JA, new KreeftenComparatorNL());

Collections.sort 给出错误:

Collections 类型中的方法 sort(List, Comparator) 不适用于参数(JSONArray、ThisActicity.KreeftenComparatorNL)

有人知道如何对 JSONArray 进行排序吗?


问题是 JSONArray 或多或少保存了最终是字符串的 JSONObjects(和其他 JSONArrays)。将字符串完全反序列化为 POJO,对它们进行排序,然后返回 JSON 是相当繁重的。

第二个问题是 JSONArray 可以包含:Boolean、JSONArray、JSONObject、Number、String 或 JSONObject.NULL 对象;也就是说,它是混合类型,因此很难将元素转储到某种类型的列表中并对其进行排序,然后通过列表将排序后的项目转储回 JSON 数组。从 JSONArray 获取每个元素的通用类型的唯一确定方法是使用 Object get() 方法。当然,那么您拥有的只是 Object 对象,并且在不重新访问的情况下无法对它们进行任何有意义的排序序列化问题。

假设您的 JSONArray 包含同类结构的值,您可以迭代 JSONArray,对每个值调用一种类型化的 get() 方法,将它们转储到 List 类型中,然后对其进行排序。如果您的 JSONArray 仅保存“简单”类型(例如字符串或数字),则这相对容易。这不是确切的代码,而是类似:

List<String> jsonValues = new ArrayList<String>();
for (int i = 0; i < myJsonArray.length(); i++)
   jsonValues.add(myJsonArray.getString(i));
Collections.sort(jsonValues);
JSONArray sortedJsonArray = new JSONArray(jsonValues);

当然,如果您有嵌套对象,这可能会变得有点棘手。如果您想要在顶层实时排序的值,它可能还不错......

List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
   jsonValues.add(myJsonArray.getJSONObject(i));

然后使用这样的比较器进行排序:

class JSONComparator implements Comparator<JSONObject>
{

    public int compare(JSONObject a, JSONObject b)
    {
        //valA and valB could be any simple type, such as number, string, whatever
        String valA = a.get("keyOfValueToSortBy");
        String valB = b.get("keyOfValueToSortBy");

        return valA.compareTo(valB);
        //if your value is numeric:
        //if(valA > valB)
        //    return 1;
        //if(valA < valB)
        //    return -1;
        //return 0;    
    }
}

同样,这对 JSONArray 中数据的同质性​​做出了一些假设。如果可能的话,根据您的情况进行调整。此外,您还需要添加异常处理等。祝您编码愉快!

edit根据评论修复

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android如何对JSONObjects的JSONArray进行排序 的相关文章

随机推荐

  • iptables 阻止本地连接到 mongodb

    我有一个带有 mongodb 2 0 4 的虚拟机 Ubuntu 12 04 4 LTS 我想用 iptables 限制它只接受 SSH 输入 输出 而不接受其他任何东西 这就是我的设置脚本设置规则的方式 bin sh DROP every
  • 使用区间来分配分类值

    获取以下通用数据 A lt c 5 7 11 10 23 30 24 6 B lt c 1 2 3 1 2 3 1 2 C lt data frame A B 以及以下间隔 library intervals interval1 lt In
  • 一列中的多个图表区域

    I have a chart with multiple chart areas When I press a button a new chart area is being created etc My problem is that
  • 当一列中的单元格与另一列中的单元格不匹配时更改它们的颜色

    我想检查一列中的值是否与另一列中的值相同 每当值不相同时 我想更改这些单元格的颜色 例如 I 栏 AA 栏 两者的值都是从 1318 年到 1500 年的第一个月 阿拉伯历 但我想检查其中哪些值不匹配 例如用黄色将它们着色 在这种情况下 第
  • 信息检索中的语言模型

    我在 IR 工作 任何人都可以指导我 我该如何实现语言模型Whoosh 我已经应用了TD IDF和BM25 我是红外新手 例如 最简单形式的语言模型只是丢弃所有条件上下文 并独立估计每个术语 这样的模型称为一元语言模型 P uni t 1t
  • Ubuntu 20.04升级,Python缺少libffi.so.6

    我最近将操作系统升级到 Ubuntu 20 04 LTS 现在 当我尝试在 Python 中导入 Numpy 等库时 出现以下错误 ImportError libffi so 6 cannot open shared object file
  • 在 ASP.NET 中模拟会员用户

    在一个通用的asp net网站与Membership Roles并启用哈希密码 我想向管理员提供impersonation以便他们可以浏览该网站that用户会的 该网站应该像该用户登录一样运行 然后能够恢复到他们自己的登录状态 实现这一目标
  • 具有环境变量和可重写 CMD 的 ENTRYPOINT

    这允许 ENV VAR传递给foo ENTRYPOINT usr bin foo ENV VAR 这不会 因为传递的是文字字符串 ENV VAR 而不是环境变量的内容 ENTRYPOINT usr bin foo ENV VAR 这允许覆盖
  • Android 获取 Wifi 连接状态

    我目前正在使用NetworkRequest and NetworkCallback方法 谷歌官方推荐 获取Wifi连接状态 并且部分有效 我期待着onUnavailable 将在以下情况下被调用 close app gt turn off
  • Android - 创建可调整大小的视图

    我目前正在开发一个具有可移动和可调整大小视图的仪表板 我现在遇到的问题是我想通过触摸手势调整视图大小 因此 我想到了一个点 将其添加到选择视图中 可以拖动该点来调整所选视图的大小 这与 Android 主屏幕上的调整大小过程类似 即使经过长
  • 如何更改复选框、滑块、单选按钮和选择组件的强调色

    我想更改复选框 滑块 单选按钮和选择组件的强调色 有什么简单的方法可以做到这一点吗 您可以使用新的accent color财产 如果您正在使用Chrome 版本 93 https www chromestatus com feature 4
  • Symfony2 验证器约束 GreaterThan 其他属性

    我的验证是在 yaml 文件中定义的 如下所示 src My Bundle Resources config validation yml My Bundle Model Foo properties id NotBlank groups
  • Codeigniter 会话数据,它们只是 cookie 吗?

    我将在我的登录系统中使用 Codeigniter 的会话数据 但首先我想了解它们 所以我阅读了用户指南 据我了解 Codeigniter 的会话数据是just饼干 这是真的 这意味着如果用户禁用 cookie 他将无法使用 Codeigni
  • 从整数列表中,获取最接近给定值的数字

    给定一个整数列表 我想找到哪个数字最接近我在输入中给出的数字 gt gt gt myList 4 1 88 44 3 gt gt gt myNumber 5 gt gt gt takeClosest myList myNumber 4 有什
  • pytorch.empty 函数中未初始化的数据是什么

    我正在经历pytorch教程并遇到了pytorch empty功能 有人提到空可以用于未初始化的数据 但是 当我打印它时 我得到了一个值 这和有什么区别pytorch rand它还生成数据 我知道 rand 生成 0 到 1 之间的值 下面
  • “System.MissingMemberException:无法找到服务器工厂”启动 Microsoft.Owin 在 TeamCity 中自托管

    当 Teamcity 运行启动自托管 Web 应用程序的集成测试时 测试失败并显示错误 System MissingMemberException The server factory could not be located for th
  • 在 Jenkins 声明性管道中使用 waitForQualityGate

    Jenkins 2 50 中声明性管道中的以下 SonarQube 6 3 分析阶段失败 并在控制台日志中显示此错误 http pastebin com t2ja23vC http pastebin com t2ja23vC 进一步来说 此
  • Asp.Net Core 2.0+ 中模型验证之前的模型标准化

    我在用着自动模型验证 https blogs msdn microsoft com webdev 2018 02 02 asp net core 2 1 roadmap 参见 更好的输入处理 保持我的控制器干净 所以 HttpPost Pr
  • C# 到 C++ 数组?

    我提供了一个库 我知道它使用 C 我这样导入DLL DllImport pst private static extern int pst get sensor ref PSTSensor sensor PSTSensor 是一个结构体 在
  • Android如何对JSONObjects的JSONArray进行排序

    我制作了一个 jsonobjects 的 jsonarray 现在我需要根据 jsonobjects 中的值对 JSONArray 进行排序 以前我对自定义对象的 ArrayList 进行排序 如下所示 比较器 public class K