计算字符串重复自身的次数 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