Java 如何在Scala中提取字符串的最后一个元音及其后面的任何单词?

Java 如何在Scala中提取字符串的最后一个元音及其后面的任何单词?,java,string,scala,dictionary,Java,String,Scala,Dictionary,给定下面的映射(“菱形”->“DAYMAHND”,“千”->“THAWZAHND”),我想获取当前映射中每个项目的值,并在新映射中更新这些值,最后一个元音和后面的每一个单词作为值,同一个单词作为键。在Scala我该怎么做?我听说有人使用.stripSuffix()来实现这一点。(地图是不可变的) 输入:地图(“钻石”->“DAYMAHND”,“千”->“THAWZAHND”) 输出:地图(“钻石”->“AHND”,“千”->“AHND”) 我的尝试: val table1 = Map("DIAM

给定下面的映射(“菱形”->“DAYMAHND”,“千”->“THAWZAHND”),我想获取当前映射中每个项目的值,并在新映射中更新这些值,最后一个元音和后面的每一个单词作为值,同一个单词作为键。在Scala我该怎么做?我听说有人使用.stripSuffix()来实现这一点。(地图是不可变的)

输入:地图(“钻石”->“DAYMAHND”,“千”->“THAWZAHND”)

输出:地图(“钻石”->“AHND”,“千”->“AHND”)

我的尝试:

val table1 = Map("DIAMOND" -> "DAYMAHND", "THOUSAND" -> "THAWZAHND")
val table2 = table1.map { case (key, value) =>
                            val string_2 = value
                                        .reverse
                                        .takeWhile("AEIOU".indexOf(_) == 
                                 -1)
                                (key, string_2 + value.charAt(value.length 
                                - 1 - string_2.length))
                                 }
                                .toMap

正则表达式可能是最好的方法。这是最简单的方法

table1.mapValues(_.split("(?=[AEIUO])").last)
但是,
mapValues
将在每次读取地图时重新计算此表达式,因此如果要多次使用地图,请执行以下操作:

table1.map{case (k, v) => k -> v.split("(?=[AEIUO])").last}

您可以使用
ms mapValues f
。请参阅:@FlorianBaierl小心使用
mapValues
,如果
f
是一个昂贵的函数,它可能会严重影响性能。
table1.map{case (k, v) => k -> v.split("(?=[AEIUO])").last}