计算字符串重复自身的次数 SCALA
Count how many times a string repeats itself SCALA
您好,我正在尝试获取艺术家姓名在某些年内重复的次数,为此我有这个
var artists=Array.ofDim[String](994,2)//artist,year
var artists2=Array.ofDim[String](250)//artist name
var artists3 = Array.ofDim[Int](250)//number of times
并且用户必须输入 ano1 和 ano2,它们是我们想要的保证金年数
val loop = new Breaks;
for(i <- 0 to 993){//copiamos
loop.breakable{
for(j<- 0 to 249){
if(artists2(j).contentEquals("NULL") && artists(i)(1).toInt>=ano1 && artists(i)(1).toInt<=ano2){
artists2(j)=artists(i)(0)
artists3(j)= 1
loop.break;
}else if(artists(i)(0).contentEquals(artists2(j)) && artists(i)(1).toInt>=ano1 && artists(i)(1).toInt<=ano2){
artists3(j)= artists3(j)+1
loop.break;
}
}
}
}
println(artists2.mkString("\n"))
println(artists3.mkString(","))
出于某种原因,我的 if 不起作用或 j 在输入 if 后将自己添加 1 因为每次都是在 artists2 中创建一个新元素而不是将其添加到 artists3
我得到的输出是用 1 填充的 artists3,因为出于某种原因它从不检查 if
的另一部分
您的实施似乎有点混乱,如果我了解您的需求,我想以更 functionnal/scala 和更清晰的方式分享我如何实施您的研究。
case class Artist(name: String, year: Int)
case class ArtistNames(name: String)
case class ArtistResult(name: String, nbOccurence: Int)
val anno1 = 1950
val anno2 = 1960
def checkArtist(artists: Seq[Artist], artistNames: Seq[ArtistNames]): Seq[ArtistResult] = {
artists.map{ artist =>
def countOccurence(artist: Artist, artistNames: Seq[ArtistNames], occurence: Int): Int = {
artistNames match {
case Nil => occurence
case head :: tail =>
if (head.name == artist.name && artist.year >= anno1 && artist.year <= anno2) countOccurence(artist, tail, occurence + 1)
else countOccurence(artist, tail, occurence)
}
}
val occurrence = countOccurence(artist, artistNames, 0)
ArtistResult(artist.name, occurrence)
}
}
val artistResultList: Seq[ArtistResult] = checkArtist(/* insert your data here */)
我希望我能稍微回答你的问题。
如果这听起来有点刺耳,我很抱歉,但是您的代码有很多问题,很难知道从哪里开始。
主要问题是 1) 您的代码不太像 scala,以及 2) 您使用的数据结构和变量名称旨在让事情尽可能难以理解。
这是重新设计内容的简短尝试。它可能无法满足您的所有要求,但也许会让您朝着更好的方向迈进。
val mockdata = List( ("Tom", 2001)
, ("Sue", 2002)
, ("Joe", 2002)
, ("Sue", 2005)
, ("Sue", 2004)
, ("Jil", 2001)
, ("Tom", 2005)
, ("Sue", 2002)
, ("Jil", 2012)
)
def countArtists( dataSet: List[(String,Int)]
, anoStart: Int , anoEnd: Int): Map[String,Int] = {
val artists = for {
(artist, year) <- dataSet
if year >= anoStart && year <= anoEnd
} yield artist
artists.distinct.map(name => name -> artists.count(_ == name)).toMap
}
val count2002to2011 = countArtists(mockdata, 2002, 2011)
此时您可以使用结果来获取有趣的信息。
scala> count2002to2011.keys // all artists within the time period
res0: Iterable[String] = Set(Sue, Joe, Tom)
scala> count2002to2011.values.sum // total count within the time period
res1: Int = 6
scala> count2002to2011("Sue") // count for just this artist
res2: Int = 4
您好,我正在尝试获取艺术家姓名在某些年内重复的次数,为此我有这个
var artists=Array.ofDim[String](994,2)//artist,year
var artists2=Array.ofDim[String](250)//artist name
var artists3 = Array.ofDim[Int](250)//number of times
并且用户必须输入 ano1 和 ano2,它们是我们想要的保证金年数
val loop = new Breaks;
for(i <- 0 to 993){//copiamos
loop.breakable{
for(j<- 0 to 249){
if(artists2(j).contentEquals("NULL") && artists(i)(1).toInt>=ano1 && artists(i)(1).toInt<=ano2){
artists2(j)=artists(i)(0)
artists3(j)= 1
loop.break;
}else if(artists(i)(0).contentEquals(artists2(j)) && artists(i)(1).toInt>=ano1 && artists(i)(1).toInt<=ano2){
artists3(j)= artists3(j)+1
loop.break;
}
}
}
}
println(artists2.mkString("\n"))
println(artists3.mkString(","))
出于某种原因,我的 if 不起作用或 j 在输入 if 后将自己添加 1 因为每次都是在 artists2 中创建一个新元素而不是将其添加到 artists3
我得到的输出是用 1 填充的 artists3,因为出于某种原因它从不检查 if
的另一部分您的实施似乎有点混乱,如果我了解您的需求,我想以更 functionnal/scala 和更清晰的方式分享我如何实施您的研究。
case class Artist(name: String, year: Int)
case class ArtistNames(name: String)
case class ArtistResult(name: String, nbOccurence: Int)
val anno1 = 1950
val anno2 = 1960
def checkArtist(artists: Seq[Artist], artistNames: Seq[ArtistNames]): Seq[ArtistResult] = {
artists.map{ artist =>
def countOccurence(artist: Artist, artistNames: Seq[ArtistNames], occurence: Int): Int = {
artistNames match {
case Nil => occurence
case head :: tail =>
if (head.name == artist.name && artist.year >= anno1 && artist.year <= anno2) countOccurence(artist, tail, occurence + 1)
else countOccurence(artist, tail, occurence)
}
}
val occurrence = countOccurence(artist, artistNames, 0)
ArtistResult(artist.name, occurrence)
}
}
val artistResultList: Seq[ArtistResult] = checkArtist(/* insert your data here */)
我希望我能稍微回答你的问题。
如果这听起来有点刺耳,我很抱歉,但是您的代码有很多问题,很难知道从哪里开始。
主要问题是 1) 您的代码不太像 scala,以及 2) 您使用的数据结构和变量名称旨在让事情尽可能难以理解。
这是重新设计内容的简短尝试。它可能无法满足您的所有要求,但也许会让您朝着更好的方向迈进。
val mockdata = List( ("Tom", 2001)
, ("Sue", 2002)
, ("Joe", 2002)
, ("Sue", 2005)
, ("Sue", 2004)
, ("Jil", 2001)
, ("Tom", 2005)
, ("Sue", 2002)
, ("Jil", 2012)
)
def countArtists( dataSet: List[(String,Int)]
, anoStart: Int , anoEnd: Int): Map[String,Int] = {
val artists = for {
(artist, year) <- dataSet
if year >= anoStart && year <= anoEnd
} yield artist
artists.distinct.map(name => name -> artists.count(_ == name)).toMap
}
val count2002to2011 = countArtists(mockdata, 2002, 2011)
此时您可以使用结果来获取有趣的信息。
scala> count2002to2011.keys // all artists within the time period
res0: Iterable[String] = Set(Sue, Joe, Tom)
scala> count2002to2011.values.sum // total count within the time period
res1: Int = 6
scala> count2002to2011("Sue") // count for just this artist
res2: Int = 4