Как при установке диапазона учитывать минимальное значение
Пишу программу, которая открывает файлы и отображает ввиде таблиц. Возникла проблема с фильтрацией. Сделал возможность фильтровать таблицы по возрасту, используя диапазон (ползунок), где можно установить минимальное и максимальное значение.
Проблема в том, что в результатах минимальное значение не учитывается. То есть, например, если установить диапазон возраста от 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 &&
Безрезультатно.