Как при установке диапазона учитывать минимальное значение

Пишу программу, которая открывает файлы и отображает ввиде таблиц. Возникла проблема с фильтрацией. Сделал возможность фильтровать таблицы по возрасту, используя диапазон (ползунок), где можно установить минимальное и максимальное значение.

Проблема в том, что в результатах минимальное значение не учитывается. То есть, например, если установить диапазон возраста от 20 до 25 лет, то отображаться будет 21-25 лет. Если установить 30-40 лет, то будут отображаться 31-40. И если установить ползунок от 25 до 25 лет, соответственно ничего не будет отображаться, поскольку минимально установленное значение не учитывается.

Как сделать так, чтобы минимальное значение также учитывалось, как и максимальное?

Логика фильтров:

suspend fun filtersPeoplesLogic(
    viewModel: MainViewModel,
    peoplesFiltersVM: PeoplesFiltersViewModel
): List<People> {
    return withContext(Dispatchers.Default) {
        viewModel.peoples.filterIndexed { _, it ->
            fun isPosition(position: String): Boolean {
                return it.getPositions(viewModel, position).toIntOrNull() == 20
            }
            fun isFoot(foot: String, value: Int = 20): Boolean {
                return (it.getFoots(viewModel, foot).toIntOrNull() ?: 0) >= value
            }

            (it.getAge() in peoplesFiltersVM.rangeAge) &&
            (peoplesFiltersVM.filterFullName?.let { filter ->
                it.getFullName(viewModel).lowercase().trim()
                    .contains(filter.lowercase().trim())
            } ?: true) &&
            (peoplesFiltersVM.filterClub?.let { filter ->
                it.getClubName(viewModel).lowercase().trim()
                    .contains(filter.lowercase().trim())
            } ?: true) &&
            (peoplesFiltersVM.filterNation?.let { filter ->
                it.getNationName(viewModel).lowercase().trim()
                    .contains(filter.lowercase().trim())
            } ?: true) &&
            (peoplesFiltersVM.filterOtherNation?.let { filter ->
                it.getOtherNations(viewModel).lowercase().trim()
                    .contains(filter.lowercase().trim())
            } ?: true) &&
            (peoplesFiltersVM.filterLanguage?.let { filter ->
                it.getLanguage(viewModel).lowercase().trim()
                    .contains(filter.lowercase().trim())
            } ?: true) &&
            (peoplesFiltersVM.filterUid?.let { uid ->
                it.uid == uid
            } ?: true) && (
                when (peoplesFiltersVM.filterPeoples) {
                    PeopleTypes.ALL -> true
                    PeopleTypes.PLAYER -> (it.peopleSid != -1) &&
                        ((it.getAbilities(viewModel, "ca").toIntOrNull() ?: -1f) in peoplesFiltersVM.rangeCA) &&
                        ((it.getAbilities(viewModel, "pa").toIntOrNull() ?: -1f) in peoplesFiltersVM.rangePA) &&
                        (it.adaptability >= peoplesFiltersVM.filterAdaptability) &&
                        (it.ambition >= peoplesFiltersVM.filterAmbition) &&
                        (it.determination >= peoplesFiltersVM.filterDetermination) &&
                        (it.loyalty >= peoplesFiltersVM.filterLoyalty) &&
                        (it.pressure >= peoplesFiltersVM.filterPressure) &&
                        (it.professionalism >= peoplesFiltersVM.filterProfessionalism) &&
                        (it.sportsmanship >= peoplesFiltersVM.filterSportsmanship) &&
                        (it.temperament >= peoplesFiltersVM.filterTemperament) &&
                        (it.professionalism >= peoplesFiltersVM.rangeProf) &&
                        (when (peoplesFiltersVM.filterFoot) {
                            FootTypes.EITHER -> true
                            FootTypes.LEFT -> isFoot("left")
                            FootTypes.RIGHT -> isFoot("right")
                            FootTypes.BOTH -> isFoot("left", 16) && isFoot("right", 16)
                        }) &&
                        (when (peoplesFiltersVM.filterPositions) {
                            Positions.ALL -> true
                            Positions.GK -> isPosition("gk")
                            Positions.SW -> isPosition("sw")
                            Positions.DL -> isPosition("dl")
                            Positions.DC -> isPosition("dc")
                            Positions.DR -> isPosition("dr")
                            Positions.DMC -> isPosition("dmc")
                            Positions.ML -> isPosition("ml")
                            Positions.MC -> isPosition("mc")
                            Positions.MR -> isPosition("mr")
                            Positions.AML -> isPosition("aml")
                            Positions.AMC -> isPosition("amc")
                            Positions.AMR -> isPosition("amr")
                            Positions.ST -> isPosition("st")
                            Positions.DML -> isPosition("dml")
                            Positions.DMR -> isPosition("dmr")
                        })
                    PeopleTypes.COACH -> it.coachSid != -1
                    PeopleTypes.PHYSIO -> it.physioSid != -1
                    PeopleTypes.SCOUT -> it.scoutSid != -1
                    PeopleTypes.MANAGER -> it.managerSid != -1
                    PeopleTypes.REFEREE -> it.refereeSid != -1
                }
            )
        }.let {
            if (peoplesFiltersVM.filterCount != -1) it.take(peoplesFiltersVM.filterCount)
            else it
        }
    }
}

Класс:

class PeoplesFiltersViewModel @Inject constructor(): ViewModel() {
    var showFiltersPanel by mutableStateOf(false)
    var filterCount by mutableIntStateOf(100)
    var filterPeoples by mutableStateOf<PeopleTypes>(PeopleTypes.PLAYER)
    var rangeAge by mutableStateOf<ClosedFloatingPointRange<Float>>(0f..100f)

getAge:

fun People.getAge(): Int {
    val formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy")
    val birthDate = LocalDate.parse(dob, formatter)
    val referenceDate = LocalDate.of(2023, 7, 8)
    return ChronoUnit.YEARS.between(birthDate, referenceDate).toInt()
}

* dob идёт в формате 24/05/1995

Использую так:

FilterRange(
            range = 0f..100f,
            value = peoplesFiltersVM.rangeAge,
            title = stringResource(R.string.age_range),
        ) {
            peoplesFiltersVM.rangeAge = it
        }

FilterRange:

fun FilterRange(
    range: ClosedFloatingPointRange<Float>,
    value: ClosedFloatingPointRange<Float>,
    title: String,
    onValueChange: (ClosedFloatingPointRange<Float>) -> Unit
) {
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp, 4.dp)
    ) {
        Text(
            text = "$title: " + stringResource(R.string.range_from) + "${value.start.toInt()} " + stringResource(R.string.range_to) + " ${value.endInclusive.toInt()}",
            style = Typography.titleLarge
        )
        RangeSlider(
            valueRange = range,
            value = value,
            onValueChange = { onValueChange(it) }
        )
    }
}

Пробовал делать так:

(it.getAge().toFloat() in peoplesFiltersVM.rangeAge.start..peoplesFiltersVM.rangeAge.endInclusive)

И так:

            val age = it.getAge().toFloat()
            val ageInRange = age >= peoplesFiltersVM.rangeAge.start && age <= peoplesFiltersVM.rangeAge.endInclusive

            ageInRange &&

Безрезультатно.


Ответы (0 шт):