如何根据 Java 中给定的一组比较器对作为字符串的树图键进行排序
How to sort a treemap key that is a String according to a given set of comparator in Java
我有一个代码片段,它是一个树状图,其中键是星期几(星期一、星期二等),并且由于树状图会自动对键进行排序,因此它只会根据字母的值对其进行排序没有按照星期几排序
已经排序的地图的一些示例如下:
"Friday"
"Thursday"
"Tuesday"
"Wednesday"
impl服务中的代码如下:
@Override
public ResponseDTO findAllTransactionByUserID(String userId){
ResponseDTO responseDTO = new ResponseDTO();
Map<String, Collection<UserHistoryDto>> map = new TreeMap<>();
List<Transaction> transactions = couponTransactionRepository.findTransactionByUserId(userId);
User user = userRepository.getOne(userId); //set the object based on ID
Integer date;
String day = "";
responseDTO.setUserPoint(user.getUser_point()); //Get user-point
for (Transaction trx : transactions) {
//get the value of days as a map key
date = trx.getTrans_time().getDayOfWeek().getValue();
day = trx.getTrans_time().getDayOfWeek().name();
Collection<UserHistoryDto> col = map.getOrDefault(day, new ArrayList<>());
col.add(collect(trx));
map.put(day, col);
}
responseDTO.setHistories(map)
return responseDTO;
}
"findAllTransactionByUserID"会做查询已经按照时间排序
出来的json是:
{
"userPoint": 22735,
"histories": {
"FRIDAY": [
{
"transactionId": "CPT01552",
"date": 10,
"day": "FRIDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
}
],
"THURSDAY": [
{
"transactionId": "CPT01504",
"date": 9,
"day": "THURSDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
},
{
"transactionId": "CPT01404",
"date": 9,
"day": "THURSDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
}
],
"TUESDAY": [
{
"transactionId": "CPT01053",
"date": 7,
"day": "TUESDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
},
{
"transactionId": "CPT00952",
"date": 7,
"day": "TUESDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
}
],
"WEDNESDAY": [
{
"transactionId": "CPT01154",
"date": 8,
"day": "WEDNESDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
{
"transactionId": "CPT01102",
"date": 8,
"day": "WEDNESDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
}
]
}
}
我希望星期三在星期二上方的 JSON 地图。
像这样:
"Friday"
"Thursday"
"Wednesday"
"Tuesday"
因为比较日期的字母表是行不通的,我试图找到一种方法来制作一个比较器,我可以比较日期的 value/order 以便它可以用作比较器
i.e : Monday - 1
Tuesday - 2
也许我们可以使用代码片段中的变量 "Date" 作为在比较器中分配每个键值的方法(或者手动分配,如果 taht 有效)但是我不知道如何加入比较器两种不同的数据类型
我对 java 和 spring 引导相对较新,这是我第一次在堆栈溢出中询问,我使用 java 8 并且不太了解 lambda 表达式.. .所以任何批评和帮助都非常有帮助谢谢!
如果您将 Map
更改为 Map<Integer, Collection<UserHistoryDto>>
并将 map.put(day, col)
更改为 map.put(date, col)
,您将获得所需的排序(假设星期一的数值最低).
如果必须保留当前的Map
结构,可以将Comparator<String>
传递给TreeMap
的构造函数。 Comparator
的 compare()
方法必须将每个 String
值映射到相应的数值并比较这些值(例如,"Monday" 将映射到 1,"Tuesday" 到 2,依此类推...)。
这是创建 Comparator
的一种方法。它需要首先创建一个 Map
将天 String
映射到整数值。
Map<String,Integer> dayValues = new HashMap<>();
dayValues.put("Monday",1);
...
dayValues.put("Sunday",7);
Comparator<String> cmpDays = Comparator.comparing(dayValues::get);
...
Map<String, Collection<UserHistoryDto>> map = new TreeMap<>(cmpDays);
我有一个代码片段,它是一个树状图,其中键是星期几(星期一、星期二等),并且由于树状图会自动对键进行排序,因此它只会根据字母的值对其进行排序没有按照星期几排序
已经排序的地图的一些示例如下:
"Friday"
"Thursday"
"Tuesday"
"Wednesday"
impl服务中的代码如下:
@Override
public ResponseDTO findAllTransactionByUserID(String userId){
ResponseDTO responseDTO = new ResponseDTO();
Map<String, Collection<UserHistoryDto>> map = new TreeMap<>();
List<Transaction> transactions = couponTransactionRepository.findTransactionByUserId(userId);
User user = userRepository.getOne(userId); //set the object based on ID
Integer date;
String day = "";
responseDTO.setUserPoint(user.getUser_point()); //Get user-point
for (Transaction trx : transactions) {
//get the value of days as a map key
date = trx.getTrans_time().getDayOfWeek().getValue();
day = trx.getTrans_time().getDayOfWeek().name();
Collection<UserHistoryDto> col = map.getOrDefault(day, new ArrayList<>());
col.add(collect(trx));
map.put(day, col);
}
responseDTO.setHistories(map)
return responseDTO;
}
"findAllTransactionByUserID"会做查询已经按照时间排序
出来的json是:
{
"userPoint": 22735,
"histories": {
"FRIDAY": [
{
"transactionId": "CPT01552",
"date": 10,
"day": "FRIDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
}
],
"THURSDAY": [
{
"transactionId": "CPT01504",
"date": 9,
"day": "THURSDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
},
{
"transactionId": "CPT01404",
"date": 9,
"day": "THURSDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
}
],
"TUESDAY": [
{
"transactionId": "CPT01053",
"date": 7,
"day": "TUESDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
},
{
"transactionId": "CPT00952",
"date": 7,
"day": "TUESDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
}
],
"WEDNESDAY": [
{
"transactionId": "CPT01154",
"date": 8,
"day": "WEDNESDAY",
"titleName": "Sea Shanties",
"pointAffected": 475,
"transType": "Coupon",
"month": "MAY"
{
"transactionId": "CPT01102",
"date": 8,
"day": "WEDNESDAY",
"titleName": "Thanos super coupon",
"pointAffected": 420,
"transType": "Coupon",
"month": "MAY"
}
]
}
}
我希望星期三在星期二上方的 JSON 地图。 像这样:
"Friday"
"Thursday"
"Wednesday"
"Tuesday"
因为比较日期的字母表是行不通的,我试图找到一种方法来制作一个比较器,我可以比较日期的 value/order 以便它可以用作比较器
i.e : Monday - 1
Tuesday - 2
也许我们可以使用代码片段中的变量 "Date" 作为在比较器中分配每个键值的方法(或者手动分配,如果 taht 有效)但是我不知道如何加入比较器两种不同的数据类型
我对 java 和 spring 引导相对较新,这是我第一次在堆栈溢出中询问,我使用 java 8 并且不太了解 lambda 表达式.. .所以任何批评和帮助都非常有帮助谢谢!
如果您将 Map
更改为 Map<Integer, Collection<UserHistoryDto>>
并将 map.put(day, col)
更改为 map.put(date, col)
,您将获得所需的排序(假设星期一的数值最低).
如果必须保留当前的Map
结构,可以将Comparator<String>
传递给TreeMap
的构造函数。 Comparator
的 compare()
方法必须将每个 String
值映射到相应的数值并比较这些值(例如,"Monday" 将映射到 1,"Tuesday" 到 2,依此类推...)。
这是创建 Comparator
的一种方法。它需要首先创建一个 Map
将天 String
映射到整数值。
Map<String,Integer> dayValues = new HashMap<>();
dayValues.put("Monday",1);
...
dayValues.put("Sunday",7);
Comparator<String> cmpDays = Comparator.comparing(dayValues::get);
...
Map<String, Collection<UserHistoryDto>> map = new TreeMap<>(cmpDays);