-
-
Save lnfn/b36e0ea702d5db35969868005506bca7 to your computer and use it in GitHub Desktop.
1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fun main(args: Array<String>) { | |
val enter = 5900 | |
val rez = Operation.getFakeData().getRecommendedCategories(enter) | |
println(rez) | |
} | |
/** | |
* Фильтруем историю операций по сумме + - 15 %, например. | |
* После группируем назваиния категорий и сортируем по количеству названий в каждой категории (в обратном порядке), | |
* чтобы получить наиболее часто используемые . Можено сделать за какой то период времени, например. | |
* Далее берем первые несколько названий категорий и показываем пользователю. | |
* | |
* Если не находится похожих значений, то можно найти самые приближенные по сумме и отдать пользователю их. | |
* Также можно группировать операции по датам (месяцам). Находить одинаковые, | |
* которые периодически повторяются приблизительно в одно и тоже время + - 2 дня, например. | |
* И если вводимое пользователем значение приблизительно совпадают, то добавлять в список рекомендованных категорий (например оплата ЖКХ). | |
*/ | |
fun List<Operation>.getRecommendedCategories(value: Int, percents: Int = 15): List<String> = this | |
.filter { value < it.sum + it.sum.calcPercennts(percents) && value > it.sum - it.sum.calcPercennts(percents) } | |
.map { it.category } | |
.groupBy { it } | |
.toList() | |
.sortedByDescending { it.second.size } | |
.map { it.first } | |
.take(3) | |
fun Int.calcPercennts(percent: Int): Int = ((this * percent) / 100).toInt() | |
data class Operation( | |
val date: String, | |
val sum: Int, | |
val category: String | |
) { | |
companion object { | |
fun getFakeData(): List<Operation> = listOf( | |
Operation("9.9.17", 7200, "ЖКХ"), | |
Operation("1.3.17", 2000, "Заправка"), | |
Operation("11.3.17", 2900, "Развлечения"), | |
Operation("1.3.17", 55, "Проезд"), | |
Operation("5.3.17", 6800, "Авто"), | |
Operation("1.3.17", 1500, "Продукты"), | |
Operation("6.3.17", 5900, "Фитнес"), | |
Operation("11.3.17", 1700, "Продукты"), | |
Operation("11.3.17", 35, "Проезд"), | |
Operation("11.3.17", 2900, "Развлечения"), | |
Operation("11.3.17", 7000, "ЖКХ"), | |
Operation("5.3.17", 6500, "Авто") | |
) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment