Home > Mobile >  Kotlin and String.contains() not working as I thought
Kotlin and String.contains() not working as I thought

Time:10-25

I thought I knew how string.contains() worked in Kotlin and Java, but apparently I don't.

I'vet got a small piece of code that takes a list of file names, and puts them in another list if the do not contain certain words.

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

However, this does not exclude a file which contains the phrase "sperretstrengtreservert", even though both "reservert" and "sperret" is in the "not contains".

How come? I thought .contains found every occurence of a substring?

But if you look at the debug run, a file containing two of the phrases that are to be ignored, is indeed not ignored:

enter image description here

UPDATE:

To be clear, I'm looking for any of the file names to contain one OR more of the strings. So the logical OR/|| is correct.

However, I missed some indices. But adding them changed nothing. See the updated code below:

enter image description here

As far as I can see, the code now clearly says IF THE STRING DOES NOT CONTAIN THIS, THIS OR THIS SUBSTRING... But still, a string containing two of the substrings gets a match.

Strangely, if I only use ONE substring in the "not-contains" - for instance "reservert", the code does indeed skip all strings not containing that. But when I use the || operator for several substrings, things gets messed up.

CodePudding user response:

"sperretstrengtreservert" does not contain utenfastbopel.

You are using || aka OR. Your first condition is true.

If any of these is true, it will go to the body of the condition.

!filliste[i].contains("utenfastbopel") ||
!filliste.contains("sperret") ||
!filliste.contains("reservert")

Also as said you are not accessing the same object in the follow-up conditions although it wouldn't change the result as is.

You need to change it from "at least one of these conditions must be true" to "all of these conditions must be true" && aka AND.

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