Tag: 功能编程

将程序风格方法转换为功能风格

下面的代码应该是通过遍历从红黑树的根到底部的左节点来计算黑节点。 黑色节点的数量存储在变量black : fun isBalanced1(): Boolean { require(!isEmpty()) { "Cannot check empty tree for balance"} var x = root var black = 0 while(x != null) { if(!isRed(x)) { black++ } x = x.left } return isBalanced(root, black) } 风格是程序性的,它工作正常。 现在怎么可能在一个更实用的风格上做同样的事情呢? 这就是我想到的: fun isBalanced1(): Boolean { require(!isEmpty()) { "Cannot check empty tree for balance" } […]

使用函数式编程来计数每个标签的出现次数

我对函数式编程和Kotlin相当陌生,我一直试图做一个函数,返回一个Map<String, Int>其中的键是一个特定的标签,值是出现次数。 我发现一些文章指出我正确的方向(我认为),但是我不能将代码“翻译”成在Kotlin中可用的东西。 这里有一些代码,以更好地说明我正在做什么,我想完成什么。 我需要从中提取信息的对象(简化): class Note { List<String> tags } 到目前为止的功能: private fun extractTags(notes: List<Note>): Map<String, Int> { return notes.map { note -> note.tags } .groupBy { it } .mapValues { it.value.count() } } 现在编译器给我一个Map<(Mutable)Set<String!>!, Int>的返回类型不匹配,我不确定我得到了期望的结果(因为我仍然无法正确测试)。 我期待的结果是: tag1, 1 tag2, 4 tag3, 14 etc.

Kotlin / Java在地图中收集地图的功能和不可变的方式

目前,我正在通过Java API读取文件,并通过foreach方法将项目添加到地图,这迫使我使用mutablemap。 有没有收集项目没有mutablemap的方式? 我知道有一个方法收集,但我无法得到它的工作。 目前的方式: val result = mutableMapOf<Int, MutableMap<Int, Double>>() Files.lines(Paths.get(folderPath)) .map { line -> line.split(",") } .map { items -> Triple(items[0].toInt(), items[1].toInt(), items[2].toDouble()) } .forEach { (id, article, rating) -> if (result.containsKey(id)) result[id]!!.put(article, rating) else result.put(id, mutableMapOf(Pair(article, rating))) } 编辑: 我的目标是基于三元组的第一个值合并三元对象。 所以情景会是两个三重对象(1,2,5.5)和(1,3,5.5)。 三元组的第一个值是用户ID,第二个是文章ID,第三个是文章的评分。 在合并之后,在地图上将会有一个单独的条目,其中包含第一个键=用户ID,三元组的第一个值,并且该值将是包含用户评分的文章的地图。 目前我正在努力工作,但是我很好奇是否有解决这个问题的更有效的方法。

Kotlin – 如何查找列表中的重复值的数量?

我有一个列表,例如: val list = listOf("orange", "apple", "apple", "banana", "water", "bread", "banana") 我该如何检查苹果在这个列表中被复制了多少次?

在kotlin中将命令式的根函数转化为函数式

根函数检查并遍历,直到获得树中的根元素。 class NodeRoot(N: Int){ private val id: IntArray = IntArray(N) init { (0..N-1).forEach{ id[it] = it } } fun root(i: Int): Int { var i = i while (i != id[i]) i = id[i] return i } }

以Kotlin的最后一个元素

我有一个列表,我想要应用一些转换,但不包括前两个元素。 我怎样才能做到最好的方式? 像这样的东西: list.reversed().take(list.size – 2)…(my transformations) 要么 list.excludeFirstN(2)…(my transformations)

用Kotlin流收集物品

我有一个有Bag的Player ,每个Bag都有物品( String ): class Player(val bags: List<Bag>) class Bag(val items: List<String>) 我想收集每个包和它的每个项目在一个列表中。 使用嵌套for循环,我这样做: val player = Player(listOf(Bag(listOf("item1.1", "item1.2")), Bag(listOf("item2.1", "item2.2")))) val list = mutableListOf<Any>() for (bag in player.bags) { list.add(bag) for (item in bag.items) { list.add(item) } } //list contains [Bag@7adf9f5f, item1.1, item1.2, Bag@85ede7b, item2.1, item2.2] 我如何使用流实现相同的行为? 我已经尝试过了,但我只是拿到了物品,而不是包包: val list = player.bags.flatMap { bag […]

在Kotlin的Unit函数中累积的功能方法?

我试图强迫自己在Kotlin中使用函数式编程,并尽可能避免使用可变变量。 通常,对于一个单元返回函数的临时测试,我只是println()函数内的东西,看看它是否正常工作。 但是对于这个测试,我需要累积一个字符串,然后最终使用assertEquals(…) 。 和往常一样,我发现自己在封闭范围内声明了一个var ,并使用+=来积累它。 有一个更有效的方法来做到这一点,通过传递/链接一个函数,并消除可变的变种? 这里有一些简单但是说明性的代码: inline fun <T> Iterable<T>.forEachFrom(beg:Int, act:(T)->Unit) { var i=0; if (beg>=0) for (e in this) if (i++ >= beg) act(e) } fun main(args:Array<String>) { val l = listOf("zero", "one", "two", "three", "four") // print-to-screen test l.forEachFrom(2){print("$it-")}; println() // output: two-three-four- // accumulate-in-var test var s = "" l.forEachFrom(2){s […]

应用程序可以在kotlin中“很好地”实现吗?

我已经定义了一个Result类型,如下所示: sealed class BadResult { data class Description(val description: String): BadResult() data class Exception (val exception : Throwable): BadResult() } sealed class BadTree { data class Leaf(val v: BadResult) : BadTree() data class Fork(val l: BadTree, val r: BadTree) : BadTree() } sealed class Result<T> { data class Good<T> (val good : T ) : […]

使用Kotlin将序列分散到三个列表的习惯性方法

所以这可能比Kotlin更多的是函数式编程,我在这个阶段有一点知识是危险的,而且我在Kotlin上写了这个应用程序,所以把Kotlin问题当作我感兴趣的Kotlins结构似乎是公平的。 我有一系列的项目,他们是三批,所以流可能看起来像 1,a,+,2,b,*,3,c,&……. 我想要做的就是把它分成三个列表,目前我通过将它分成两个列表,一个是包含数字的列表,另一个是包含所有其他列表的列表,然后将结果的后半部分,字母和符号以及再分割成字母和符号,这样我就得到了三个列表。 这让我觉得效率不高,也许功能性的方法不是最好的方法。 有没有这样做的有效方式,我的选择,这个或for循环? 谢谢