List<Map<String, Object>> 数组根据时间排序


List<Map<String, Object>> textList = new LinkedList();
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("replytime","2023-07-31 13:00:00");
        map.put("name","下午一点");
        Map<String, Object> map1 = new LinkedHashMap<>();
        map1.put("replytime","2023-07-31 14:00:00");
        map1.put("name","下午二点");
        Map<String, Object> map2 = new LinkedHashMap<>();
        map2.put("replytime","2023-07-31 15:00:00");
        map1.put("name","下午三点");
        textList.add(map);
        textList.add(map1);
        textList.add(map2);
        System.out.println("初始数组:"+textList);

在不建立Bean类的情况下,根据时间字符串 对textList排序?
我要用groovy写
网上列举了用 Collections.sort(list); 但是我里面的map不是个对象,怎么处理?

1、新建一个list,然后把你的textList 里面所有map的replytime值存到这个list里面
2、把这个list排序
3、新建一个结果List<Map<String, Object>> resTextList,
4、遍历list,每个值比如是replytime1,在这个循环里面,遍历textList ,取每个map,判断当前map里面的replytime是否等于replytime1,等于则添加到resTextList
5、让textList =resTextList,就能排序了

        List<Map<String, Object>> textList = new LinkedList();
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("replytime", "2023-07-31 14:00:00");
        map.put("name", "下午一点");
        Map<String, Object> map1 = new LinkedHashMap<>();
        map1.put("replytime", "2023-07-31 13:00:00");
        map1.put("name", "下午二点");
        Map<String, Object> map2 = new LinkedHashMap<>();
        map2.put("replytime", "2023-07-31 15:00:00");
        map1.put("name", "下午三点");
        textList.add(map);
        textList.add(map1);
        textList.add(map2);
        System.out.println("初始数组:" + textList);

        List<String> list = new LinkedList<>();
        for (Map<String, Object> stringObjectMap : textList) {
            list.add(stringObjectMap.get("replytime").toString());
        }
        System.out.println("中间数组:" + list);
        Collections.sort(list);

        List<Map<String, Object>> resTextList = new LinkedList();
        for (String s : list) {
            for (Map<String, Object> stringObjectMap : textList) {
                if (stringObjectMap.get("replytime").equals(s)) {
                    resTextList.add(stringObjectMap);
                }
            }
        }

        textList = resTextList;
        System.out.println("转换数组:" + textList);

img


如果有用,请给个采纳,谢谢

可以用jdk8的stream流来操作。具体如下:

img


输出结果:

img

代码案例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class Test {
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //主函数直接输出
    public static void main(String[] args) {
        List<Map<String, Object>> textList = new ArrayList<>();// Your list of maps here
        Map<String, Object> map0 = new LinkedHashMap<>();
        map0.put("replytime", "2023-07-31 13:00:00");
        map0.put("name", "下午一点");
        Map<String, Object> map1 = new LinkedHashMap<>();
        map1.put("replytime", "2023-07-31 12:00:00");
        map1.put("name", "下午十二点");
        Map<String, Object> map2 = new LinkedHashMap<>();
        map2.put("replytime", "2023-07-31 15:00:00");
        map2.put("name", "下午三点");
        textList.add(map0);
        textList.add(map1);
        textList.add(map2);
        List<Map<String, Object>> sortedList = textList.stream()
                .sorted(Comparator.comparing(map -> {
                    try {
                        return dateFormat.parse((String) map.get("replytime"));
                    } catch (ParseException e) {
                        e.printStackTrace();
                        return null;
                    }
                }))
                .collect(Collectors.toList());
        sortedList.forEach(System.out::println);
    }

}

List<Map<String, Object>> textList = new LinkedList()
Map<String, Object> map = new LinkedHashMap<String, Object>()
map.put("replytime", "2023-07-31 13:00:00")
map.put("name", "下午一点")
Map<String, Object> map1 = new LinkedHashMap<String, Object>()
map1.put("replytime", "2023-07-31 14:00:00")
map1.put("name", "下午二点")
Map<String, Object> map2 = new LinkedHashMap<String, Object>()
map2.put("replytime", "2023-07-31 15:00:00")
map2.put("name", "下午三点")
textList.add(map)
textList.add(map1)
textList.add(map2)
println "初始数组:" + textList

textList.sort { a, b ->
    Date.parse("yyyy-MM-dd HH:mm:ss", a.replytime) <=> Date.parse("yyyy-MM-dd HH:mm:ss", b.replytime)
}

println "排序后的数组:" + textList

map不是对象?不是new操作的吗?

【以下回答由 GPT 生成】

这个问题可以使用Groovy的sortBy方法来解决,sortBy方法可以指定一个闭包作为排序的依据。根据时间字符串进行排序需要对时间字符串进行解析,并将其转换为对应的Date类型。以下是一个可行的解决方案:

// 导入相关类
import java.text.SimpleDateFormat
import java.util.Date

// 日期格式化器,用于解析时间字符串
def dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

// 使用sortBy方法对textList进行排序
textList.sortBy { map ->
    // 获取replytime对应的时间字符串
    def timeStr = map["replytime"]
    // 将时间字符串解析为Date类型
    def date = dateFormat.parse(timeStr)
    // 返回Date对象作为排序的依据
    date
}

// 输出排序后的结果
println "排序后的数组:$textList"

这段代码首先导入了SimpleDateFormatDate类,并创建了一个日期格式化器对象dateFormat,用于解析时间字符串。然后使用sortBy方法对textList进行排序,排序依据是每个map中replytime对应的时间字符串转换后的Date对象。最后输出排序后的结果。

运行以上代码,可以得到如下输出结果:

排序后的数组:[[replytime:2023-07-31 13:00:00, name:下午一点], [replytime:2023-07-31 14:00:00, name:下午二点], [replytime:2023-07-31 15:00:00, name:下午三点]]

注意:在进行时间字符串的解析和格式化时,需要处理可能会出现的异常,例如ParseException。此外,上述代码使用了默认的时区和Locale,如果需要指定时区,请在创建SimpleDateFormat对象时进行设置。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^