You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中String.contains()逻辑不符合预期问题排查

问题分析与修正

你的代码逻辑完全搞反了——你想排除包含任意一个指定子串的文件,但当前条件!contains("utenfastbopel") || !contains("sperret") || !contains("reservert")实际表达的是:只要文件名不同时包含这三个子串,就会被加入列表。

比如文件名sperretstrengtreservert包含sperret和reservert,所以!contains("sperret")和!contains("reservert")都是false,但!contains("utenfastbopel")是true,整个false || false || true的结果为true,导致这个本该被排除的文件被错误加入列表。

正确逻辑与代码

要实现「排除包含任意一个指定子串的文件」,正确条件是文件名同时不包含所有三个子串,有两种直观写法:

写法一:用&&连接所有否定条件

for (i in 0..filliste.size-1) {
    val fileName = filliste[i]
    if (!fileName.contains("utenfastbopel") && !fileName.contains("sperret") && !fileName.contains("reservert")) {
        tempFnrliste += fileName.split("_")[0]
    }
}

写法二:整体否定「包含任意一个子串」的情况(更易读)

for (i in 0..filliste.size-1) {
    val fileName = filliste[i]
    if (!(fileName.contains("utenfastbopel") || fileName.contains("sperret") || fileName.contains("reservert"))) {
        tempFnrliste += fileName.split("_")[0]
    }
}

更简洁的Kotlin风格写法(可选)

用forEach遍历替代索引循环,更符合Kotlin的惯用写法:

filliste.forEach { fileName ->
    if (!(fileName.contains("utenfastbopel") || fileName.contains("sperret") || fileName.contains("reservert"))) {
        tempFnrliste += fileName.split("_")[0]
    }
}

逻辑原理(德摩根定律)

你的错误本质是没理清逻辑运算的等价转换:

  • !A || !B || !C 等价于 !(A && B && C):只有当文件名同时包含三个子串时才会被排除,其他情况都加入
  • !A && !B && !C 等价于 !(A || B || C):只要文件名包含任意一个子串就排除,只有都不包含才加入

内容的提问来源于stack exchange,提问作者user9347168

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:10:38