Skip to content

Instantly share code, notes, and snippets.

@lnfn
Last active August 15, 2018 19:10
Show Gist options
  • Save lnfn/b36e0ea702d5db35969868005506bca7 to your computer and use it in GitHub Desktop.
Save lnfn/b36e0ea702d5db35969868005506bca7 to your computer and use it in GitHub Desktop.
1
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