如何在没有foreach()的情况下使用string.split()?

时间:2019-09-10 16:56:27

标签: scala

在Scala中编写一个程序,该程序从键盘读取String并计算字符数,而忽略它的UpperCase或LowerCase 例如:鳄梨 R:A = 2; v = 1; o = 2; c = 1; d = 2;

因此,我尝试用两个fors遍历字符串,然后有条件地将位置(x)处的字符转换为Upper并与位置相同(y)处的字符进行比较...基本上,我正在转换相同的字符,因此我可以在计数器中递增,例如:Ava-> A = 2; v = 1;

但是按照这种逻辑,当我打印结果时会附带: 例如:鳄梨 R:A = 2; v = 1; o = 2; c = 1; a = 2; d = 1; o = 2; 它在结果中重复相同的字符Upper或Lower ... 所以我的老师要求我们使用split方法和Scala的收益来解决这个问题,但是我不知道如何在没有forEach()且他不允许我们使用的情况下使用split。

抱歉英语不好

object ex8 {
  def main(args: Array[String]): Unit = {
    println("Write a string")
    var string = readLine()
    var cont = 0

    for (x <- 0 to string.length - 1) {
      for (y <- 0 to string.length - 1) {
        if (string.charAt(x).toUpper == string.charAt(y).toUpper)
          cont += 1
      }
      print(string.charAt(x) + " = " + cont + "; ")
      cont = 0
    }
  }
}

但是按照这种逻辑,当我打印结果时会附带: 例如:鳄梨 R:A = 2; V = 1; o = 2; c = 1; a = 2; d = 1; o = 2;

3 个答案:

答案 0 :(得分:4)

Scala 2.13添加了一种非常方便的方法来解决此类问题。

inputStr.groupMapReduce(_.toUpper)(_ => 1)(_+_)
        .foreach{case (k,v) => println(s"$k = $v")}
//A = 2
//V = 1
//C = 1
//O = 2
//D = 1

答案 1 :(得分:3)

string.IsNullOrWhiteSpace(variable2?.SubItem?.Value2) 的各个元素(即String的集合,用Char区分大小写)进行分组,以汇总其相应的{{1} }使用toLower

size

答案 2 :(得分:2)

Scala 2.11

尝试了经典的map => group => reduce单词计数方法

from pathlib import Path

loc = r'C:\Users\acer\Documents\Tesis'

# this will find all the .nc files in the directory
files = Path(loc).glob('*.nc') 

# A loop will allow you to access each file
for file in files:
    print(file)

答案:

val exampleStr = "Avocado R"

exampleStr.
  toLowerCase.
  trim.
  replaceAll(" +","").
  toCharArray.map(x => (x,1)).groupBy(_._1).
  map(x => (x._1,x._2.length))