【发布时间】:2019-12-24 11:23:39
【问题描述】:
我想根据期间内的日期对 json 进行排序,但它还包含其他字符串(MAT TY 和 MAT YA)值,我们必须始终保留在列表的前面(首先是 MAT TY,然后是 MAT YA)和之后的排序项目,我该怎么做?这是 JSON 响应:
[{
"Period": "MAT YA",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "DEC 2018",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "NOV 2018",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "SEP 2018",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "JUN 2019",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "MAT TY",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "MAT YA",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "MAT YA",
"StartUnit": null,
"EndUnit": null,
},
{
"Period": "MAT TY",
"StartUnit": null,
"EndUnit": null,
}
]
我知道 Comparator 是这样的:
myDateList.sortWith(Comparator { s1, s2 -> myDateList.indexOf(s1).compareTo(myDateList.indexOf(s2))})
那么我怎样才能将它转换为满足上述要求呢?
更新: 自定义比较器:
private fun customSortFunction(mydateList: ArrayList<String>){
val sdf = SimpleDateFormat("MMM yyyy")
val comparator = Comparator<String> { date1, date2 ->
if (date1 == "MAT TY") return@Comparator -1
if (date2 == "MAT TY") return@Comparator 1
if (date1 == "MAT YA") return@Comparator -1
if (date2 == "MAT YA") return@Comparator 1
val date1Formatted = sdf.parse(date1)
val date2Formatted = sdf.parse(date2)
return@Comparator date1Formatted.compareTo(date2Formatted)
}
mydateList.sortWith(comparator)
Log.e(TAG, "Date list: "+ mydateList)
}
堆栈跟踪:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeCollapse(TimSort.java:441)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1523)
at java.util.Collections.sort(Collections.java:238)
at kotlin.collections.CollectionsKt__MutableCollectionsJVMKt.sortWith(MutableCollectionsJVM.kt:34)
at com.abc.ShareStoryFragment.customSortFunction(ShareStoryFragment.kt:429)
第429行是:
mydateList.sortWith(comparator)
Mydatelist 值:
[SEP 2019, JUL 2019, AUG 2019, JUN 2019, MAY 2019, APR 2019, MAT TY, MAR 2019, FEB 2019, MAT YA, NOV 2018, SEP 2018, DEC 2018, OCT 2018, JAN 2019, FEB 2019, SEP 2018, JAN 2019, NOV 2018, OCT 2018, DEC 2018, MAT YA, MAT YA, NOV 2018, MAR 2019, MAT TY, SEP 2018, OCT 2018, DEC 2018, APR 2019, JUL 2019, APR 2019, SEP 2019, AUG 2019, MAY 2019, AUG 2019, MAT TY, JAN 2019, FEB 2019, JUN 2019, MAR 2019, MAY 2019, SEP 2019, JUL 2019, JUN 2019, APR 2019, MAR 2019, FEB 2019, MAY 2019, JAN 2019, MAT YA, MAT TY, AUG 2019, DEC 2018, SEP 2019, JUL 2019, NOV 2018, JUN 2019, SEP 2018, OCT 2018, SEP 2019, AUG 2019, JUL 2019, MAY 2019, APR 2019, JUN 2019, MAT TY, MAR 2019, FEB 2019, MAT YA, DEC 2018, OCT 2018, NOV 2018, JAN 2019, SEP 2018, MAT YA, SEP 2018, DEC 2018, OCT 2018, NOV 2018, FEB 2019, JAN 2019, MAR 2019, APR 2019, MAT TY, JUL 2019, MAY 2019, JUN 2019, SEP 2019, AUG 2019, JUN 2019, AUG 2019, SEP 2019, OCT 2018, JUL 2019, SEP 2018, MAY 2019, MAT TY, JAN 2019, NOV 2018, DEC 2018, FEB 2019, MAR 2019, APR 2019, MAT YA]
请帮忙。
【问题讨论】:
-
从
json生成模型并对列表进行排序 -
@Md.Asaduzzaman 我可以进行正常排序,但如何将 MAT TY 值保持在顶部,并且日期仅采用月年格式。
-
您可以在自定义比较器中创建特殊情况。您能否发布有关如何对列表进行排序的代码?
-
@Christilyn 请检查一下
-
试试docs.oracle.com/javase/8/docs/api/java/time/…... 这会将其解析为 YearMonth。您只需要制作 DateTimeFormatter。