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
相关产品推荐
相关产品推荐

