按照时间排序,时间正序,时间倒序

这篇博客探讨了两种时间排序方法:一种是按时间倒序排列的`ReverseDate`函数,另一种是按时间正序排列的`ForwardRankingDate`函数。这两个函数都通过比较日期并交换元素来实现排序,对于处理包含时间戳的数据非常有用。

封装时间排序

按照时间倒序


  function ReverseDate(data, p) {
    for (i = 0; i < data.length - 1; i++) {
         for (j = 0; j < data.length - 1 - i; j++) {
             console.log(Date.parse(data[j][p]));
            if (Date.parse(data[j][p]) < Date.parse(data[j+1][p])) {
                 var temp = data[j];
                 data[j] = data[j + 1];
                 data[j + 1] = temp;
            }
        }
     }
     return data;
     }
//使用
    dataContent = ReverseDate(data, "creattime");   //传入数据和对应需要排序的时间字段
  

//日期排序-正序

   function ReverseDate(data, p) {
    for (i = 0; i < data.length - 1; i++) {
        for (j = 0; j < data.length - 1 - i; j++) {
             console.log(Date.parse(data[j][p]));
          if (Date.parse(data[j][p]) > Date.parse(data[j+1][p])) {
                 var temp = data[j];
                data[j] = data[j + 1];
                 data[j + 1] = temp;
             }
         }
    }
    return data;
}
//使用
dataContent = ForwardRankingDate(data, "endtime"); 
<think>我们在处理一个ArrayList,其中每个元素可能包含文件名和修改时间。我们需要根据这两个属性进行排序(可能单独或组合)。在Kotlin中,我们可以使用`sortedBy`()和`sortedByDescending`(倒序)或者使用`sortedWith`并传入自定义的比较器(Comparator)来实现更复杂的排序(比如多条件排序)。 假设我们有一个类`FileItem`,它包含两个属性:`fileName`(字符串类型)和`modificationTime`(可能是`Long`类型的时间戳,或者`java.util.Date`等)。 例如: ```kotlin data class FileItem(val fileName: String, val modificationTime: Long) ``` 现在,我们有一个`ArrayList<FileItem>`,我们想按照以下方式排序: 1. 按文件名/倒序 2. 按修改时间/倒序 3. 组合排序(例如先按文件名排序,文件名相同的再按修改时间排序) 我们将分别展示这些情况。 ### 1. 按文件名排序 - (升):使用`sortedBy`或`sortedWith(compareBy{...})` - 倒序(降):使用`sortedByDescending`或`sortedWith(compareByDescending{...})`,或者使用`reversed()`但更推荐直接使用降函数。 ### 2. 按修改时间排序 - 类似文件名排序,只是属性不同。 ### 3. 多条件排序 - 使用`compareBy`()或`compareByDescending`(倒序)构建比较器链,可以添加多个条件。 - 语法:`list.sortedWith(compareBy<FileItem> { it.property1 }.thenBy { it.property2 })` 或者倒序:`list.sortedWith(compareByDescending<FileItem> { it.property1 }.thenByDescending { it.property2 })` - 注意:每个条件可以单独指定倒序,使用`thenBy`()或`thenByDescending`(倒序)。 下面我们通过代码示例展示: ```kotlin data class FileItem(val fileName: String, val modificationTime: Long) fun main() { val fileList = arrayListOf( FileItem("document.txt", 1620000000000), FileItem("image.png", 1625000000000), FileItem("audio.mp3", 1623000000000), FileItem("document.txt", 1622000000000) // 同文件名,不同时间 ) // 1. 按文件名(升:A-Z) val sortedByNameAsc = fileList.sortedBy { it.fileName } println("按文件名:") sortedByNameAsc.forEach { println(it) } // 2. 按文件名倒序(降:Z-A) val sortedByNameDesc = fileList.sortedByDescending { it.fileName } println("\n按文件名倒序:") sortedByNameDesc.forEach { println(it) } // 3. 按修改时间(升:从早到晚) val sortedByTimeAsc = fileList.sortedBy { it.modificationTime } println("\n按修改时间:") sortedByTimeAsc.forEach { println(it) } // 4. 按修改时间倒序(降:从晚到早) val sortedByTimeDesc = fileList.sortedByDescending { it.modificationTime } println("\n按修改时间倒序:") sortedByTimeDesc.forEach { println(it) } // 5. 多条件排序:先按文件名,再按修改时间倒序(同一文件名下,最新的排前面) val sortedByMultiple = fileList.sortedWith( compareBy<FileItem> { it.fileName } // 文件名 .thenByDescending { it.modificationTime } // 修改时间倒序 ) println("\n多条件排序(文件名,修改时间倒序):") sortedByMultiple.forEach { println(it) } // 6. 多条件排序:先按文件名倒序,再按修改时间 val sortedByMultiple2 = fileList.sortedWith( compareByDescending<FileItem> { it.fileName } // 文件名倒序 .thenBy { it.modificationTime } // 修改时间 ) println("\n多条件排序(文件名倒序,修改时间):") sortedByMultiple2.forEach { println(it) } } ``` 输出示例(具体输出取决于数据): ``` 按文件名: FileItem(fileName=audio.mp3, modificationTime=1623000000000) FileItem(fileName=document.txt, modificationTime=1620000000000) FileItem(fileName=document.txt, modificationTime=1622000000000) FileItem(fileName=image.png, modificationTime=1625000000000) 按文件名倒序: FileItem(fileName=image.png, modificationTime=1625000000000) FileItem(fileName=document.txt, modificationTime=1620000000000) FileItem(fileName=document.txt, modificationTime=1622000000000) FileItem(fileName=audio.mp3, modificationTime=1623000000000) ...(其他输出略) ``` 注意:`sortedBy`和`sortedWith`等函数返回一个新的排序后的列表(只读List),不会改变原始列表。如果你想在原`ArrayList`上排序(改变自身),可以使用`sortBy`、`sortByDescending`或`sortWith`(注意:这些是可变列表的方法,ArrayList是MutableList的子类,所以可用)。 例如,对原列表进行按文件名排序: ```kotlin fileList.sortBy { it.fileName } ``` 或者使用`sortWith`进行多条件排序: ```kotlin fileList.sortWith(compareBy({ it.fileName }, { it.modificationTime })) ``` 总结: - 单条件排序:`sortedBy` / `sortedByDescending`(返回新列表)或`sortBy`/`sortByDescending`(原地排序)。 - 多条件排序:`sortedWith`(返回新列表)或`sortWith`(原地排序)配合`compareBy`(可以链式调用`thenBy`等)。 引用说明:在引用[1]中提到了使用Java Stream API的Comparator进行排序倒序),在Kotlin中我们使用了更简洁的扩展函数,但原理类似(都是使用比较器)[^1]。 如果用户需要更复杂的比较逻辑(比如忽略文件名大小写),可以在比较器中指定,例如: ```kotlin sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.fileName }) ``` 或者: ```kotlin sortedBy { it.fileName.toLowerCase() } ``` 但注意,使用`toLowerCase()`可能涉及区域设置问题,推荐使用`compareBy`并传入`String.CASE_INSENSITIVE_ORDER`。 例如,忽略大小写的文件名: ```kotlin val sortedByNameIgnoreCase = fileList.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.fileName }) ``` 或者使用Kotlin 1.3及以上版本,可以使用: ```kotlin val sortedByNameIgnoreCase = fileList.sortedBy { it.fileName.lowercase() } ``` 但注意:使用`lowercase()`(Kotlin 1.3+)或`toLowerCase()`会创建新的字符串,对于非常大的列表可能有性能影响。使用`String.CASE_INSENSITIVE_ORDER`则不会创建新字符串。 因此,根据需求选择合适的方法。 相关问题: 1. Kotlin中如何对集合进行自定义复杂排序(例如,不同的属性使用不同的排序方向)? 2. Kotlin中的排序函数(如sortedBy)与Java的Stream API排序有何性能差异? 3. 在Kotlin中如何实现不区分大小写的字符串排序?</think>### Kotlin 中对 ArrayList 按文件名和修改时间排序/倒序) 在 Kotlin 中,对 `ArrayList` 按文件名和修改时间排序需要结合 `sortedWith()` 和自定义比较器。以下是完整实现方案,支持单条件/多条件排序/倒序排列: #### 1. 数据模型准备 假设我们有一个文件类 `FileItem`: ```kotlin data class FileItem( val name: String, // 文件名 val modified: Long // 修改时间戳 (毫秒) ) ``` #### 2. 单条件排序 ```kotlin // 按文件名 (A-Z) val nameAscending = fileList.sortedBy { it.name } // 按文件名倒序 (Z-A) val nameDescending = fileList.sortedByDescending { it.name } // 按修改时间 (旧→新) val timeAscending = fileList.sortedBy { it.modified } // 按修改时间倒序 (新→旧) val timeDescending = fileList.sortedByDescending { it.modified } ``` #### 3. 多条件组合排序(推荐) ```kotlin // 先按文件名,再按修改时间倒序 val sortedList = fileList.sortedWith( compareBy<FileItem> { it.name } // 主排序:文件名 .thenByDescending { it.modified } // 次排序:修改时间倒序 ) // 先按修改时间倒序,再按文件名 val sortedList2 = fileList.sortedWith( compareByDescending<FileItem> { it.modified } // 主排序时间倒序 .thenBy { it.name } // 次排序:文件名 ) ``` #### 4. 自定义复杂排序 ```kotlin val customSorted = fileList.sortedWith { a, b -> // 第一优先级:文件名长度 val nameLengthCompare = a.name.length.compareTo(b.name.length) if (nameLengthCompare != 0) return@sortedWith nameLengthCompare // 第二优先级:修改时间倒序 -a.modified.compareTo(b.modified) // 负号表示倒序 } ``` #### 5. 原地排序(修改原集合) ```kotlin // 原地按文件名排序 fileList.sortBy { it.name } // 原地多条件排序 fileList.sortWith( compareBy(String.CASE_INSENSITIVE_ORDER) { it.name } // 忽略大小写 .thenByDescending { it.modified } ) ``` #### 关键说明: 1. **比较器链**:使用 `compareBy().thenBy()` 链式调用实现多级排序[^1] 2. **性能优化**:`sortedWith` 时间复杂度为 $O(n \log n)$,适合大型集合 3. **原地排序**:`sortBy`/`sortWith` 直接修改原集合,`sortedBy`/`sortedWith` 返回新集合 4. **特殊处理**: - 文件名忽略大小写:`compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }` - 空值处理:`compareBy(nullsFirst()) { it.name }` > **最佳实践**:对于文件系统排序,推荐使用多条件组合 `compareBy { it.name }.thenByDescending { it.modified }`,这符合"先按名称分组,再按时间"的常见需求[^1]。 --- ### 相关问题 1. 如何在 Kotlin 中实现不区分大小写的文件名排序? 2. Kotlin 集合排序与 Java 的 Stream API 排序有何性能差异? 3. 如何对包含空值的文件列表进行安全排序? 4. Kotlin 中 `sortBy` 和 `sortedBy` 的主要区别是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值