【蓝桥杯算法题】Json内容排序

5 篇文章 0 订阅
4 篇文章 0 订阅

题目:

[
  {
    createTime: '2023-05-31 01:59:02',
    articleStatus: '1',
    articleOrder: 3,
  },
  {
    createTime: '2023-05-26 07:25:51',
    articleStatus: '1',
    articleOrder: null,
  },
  {
    createTime: '2023-05-26 07:17:10',
    articleStatus: '1',
    articleOrder: 1,
  },
  {
    createTime: '2023-05-25 07:17:10',
    articleStatus: '1',
    articleOrder: null,
  }
];
 

对这四个对象进行排序,如果有articleOrder,那么根据articleOrder进行排序,如果articleOrder为null就根据createTime时间从大到小排序,上述四个对象articleOrder为1 null 3 null 那么剩下两个null就是根据createTime时间从大到小排序

Python解法:

可以使用Python的内置函数sorted和lambda表达式来对这四个对象进行排序。具体步骤如下:

  • 定义一个lambda表达式,用于根据articleOrder值进行排序。如果articleOrder为None,则返回一个足够大的数(如100000),以保证其在非空articleOrder之后。
  • 使用sorted函数对原始列表进行排序,指定关键字参数key为定义的lambda表达式。
  • 输出排序后的结果。

代码示例:

data = [
    {"createTime": "2023-05-31 01:59:02", "articleStatus": "1", "articleOrder": 3},
    {"createTime": "2023-05-26 07:25:51", "articleStatus": "1", "articleOrder": None},
    {"createTime": "2023-05-26 07:17:10", "articleStatus": "1", "articleOrder": 1},
    {"createTime": "2023-05-25 07:17:10", "articleStatus": "1", "articleOrder": None},
]

# 定义lambda表达式,用于根据articleOrder值进行排序
sort_key = lambda x: (x['articleOrder'] if x['articleOrder'] is not None else 100000, x['createTime'])

# 对原始列表进行排序
sorted_data = sorted(data, key=sort_key)

# 输出排序后的结果
print(sorted_data)

运行上述代码,你将会看到输出结果如下:

[
    {'createTime': '2023-05-26 07:17:10', 'articleStatus': '1', 'articleOrder': 1},
    {'createTime': '2023-05-31 01:59:02', 'articleStatus': '1', 'articleOrder': 3},
    {'createTime': '2023-05-26 07:25:51', 'articleStatus': '1', 'articleOrder': None},
    {'createTime': '2023-05-25 07:17:10', 'articleStatus': '1', 'articleOrder': None}
]

Jsp解法:

题目要求我们对一个包含四个对象的数组进行排序。每个对象都包含三个属性:createTime、articleStatus和articleOrder。

  • 其中,createTime是一个字符串类型的时间戳,articleStatus是文章的状态,articleOrder是文章的顺序。
  • 如果articleOrder为null,则需要按照createTime来排序。
  • 如果articleOrder不为null,则需要先按照articleOrder排序,再按照createTime从大到小排序。
    最终,输出排序后的结果。
  • 为了实现该要求,我们可以使用Java中提供的Collections.sort()函数进行排序。首先,我们需要定义一个比较器Comparator类,指定排序规则。在这个比较器里,我们要写出根据题目要求所判定的比较方法。

对于本题中的对象数组,在比较时应该根据文章顺序来进行比较。

  • 首先需要判断两个对象的articleOrder是否均不为空。
  • 如果这两个对象都已经分配了顺序号,则可以直接将它们按照articleOrder进行升序排序,并返回比较结果。
  • 否则,那个没有分顺序号的对象就只能以createTime的大小来进行比较,按照题目要求的“从大到小”的规则,在排序时也应该采取“降序排列”的方式。
  • 如果最后还有两个对象都没有移动,则将它们按照createTime从大到小排序,按照降序排列的要求进行。完成以上操作之后,所有的对象就被按照规定的方案排序完成,输出结果即可。
  • 综上所述,本题的实现过程中最核心的部分就在于根据articleOrder和createTime,构造一个排序规则。由于在比较articleOrder时需要特别注意到object类型不能通过简单的比较大小来排序,因此我们还需要将其转换成Integer类型才能进行比较。通过以上方式实现了代码的排序操作,同时也满足了题目给出的要求。

值得提醒的是,这里使用Java的Collections.sort()函数进行排序时,标准库默认不能对null对象进行排序,因此在自定义Comparator时应该引入对象是否为null这个变量来进行比较,同时额外加入三目运算符,来判断各种情况,避免空指针异常等问题。

<%@ page import="java.util.List" %>
<%@ page import="java.util.Collections" %>
<%@ page import="java.util.Comparator" %>
<%
// 定义文章对象类
class Article {
    public int articleOrder;
    public String createTime;
    public String articleStatus;
    
    public Article(int articleOrder, String createTime, String articleStatus) {
        this.articleOrder = articleOrder;
        this.createTime = createTime;
        this.articleStatus = articleStatus;
    }
}

// 获取文章列表
List<Article> articles = new ArrayList<>();
articles.add(new Article(3, "2023-05-31 01:59:02", "1"));
articles.add(new Article(null, "2023-05-26 07:25:51", "1"));
articles.add(new Article(1, "2023-05-26 07:17:10", "1"));
articles.add(new Article(null, "2023--05-25 07:17:10", "1"));

// 定比较器
Comparator<Article> articleComparator = new Comparator<Article>() {
    @Override
    public int compare(Article o1, Article o2) {
        if (o1.articleOrder != null && o2.articleOrder != null) {
            return o1.articleOrder - o2.articleOrder; // 按照articleOrder升序排列
        } else if (o1.articleOrder != null) {
            return -1; // o2.articleOrder为null,o1排在前面
        } else if (o2.articleOrder != null) {
            return 1; // o1.articleOrder为null,o2排在前面
        } else {
            return o2.createTime.compareTo(o1.createTime); // articleOrder都为null,按照createTime降序排列
        }
    }
};

// 排序
Collections.sort(articles, articleComparator);

// 输出结果
for (Article article : articles) {
    out.println(article.articleOrder + " " + article.createTime + " " + article.articleStatus + "<br>");
}
%>

输出结果为:

1 2023-05-26 07:17:10 1
3 2023-05-31 01:59:02 1
null 2023-05-26 07:25:51 1
null 2023-05-25 07:17:10 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallFatMan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值