List [String]从List [String,Int]查询,并对每行

时间:2018-01-21 21:11:30

标签: scala dictionary apache-spark

我有一系列List [String],

List(ejlo, adln, bew)
List(ejlo, alnw, bde)
List(dllo, aejn, bew)
List(dow, aejn, bell)
List(dell, ajno, bew)

需要使用Map [String,(String,Int)]检查每个单词以获取其值。

Map["ejlo", ("ejlo", 2)]
Map["bca", ("abc", 8)]
Map["ufi", ("iuf", 1)] 

我需要得到每一行List [String]的总和。

我该怎么做?

更新

喜欢第一个List(ejlo,adln,bew),

每个字符串都有一个来自Map的对应Int值,

所以现在我需要循环遍历每个List行,

并且,调用该Map(" ejlo"),它将返回Int值2,

然后,调用Map(" adln"),它将返回一个Int值n,

然后,调用Map(" bew"),它将返回一个Int值y,

而且,我需要这个List行的总和为2 + n + y,

最终,我需要计算每个List行的总和,

然后,找到最小值,并使用List String返回给定的List行。

我正在做类似下面的事情,但我知道它很慢,

 var finalCircledFinalAns: List[String] = List()
    var scoredCounter: Int = 99999
    var counter: Int = 0
    var tempList = new ListBuffer[String]()

    for (elem <- CircledCombinations) {
      elem.foreach{ x =>
        counter  += filteredCircledMap(x).map(_._2).head
        tempList += filteredCircledMap(x).map(_._1).head
      }
      if (scoredCounter > counter) {
        finalCircledFinalAns = tempList.toList
        scoredCounter = counter
      }
      scoredCounter = 0
      tempList = new ListBuffer[String]()
    }

感谢。

更新

CircledCombinations.foreach(println) // There are 50 rows return 
List(deen, allw, bjo)
List(abdl, ejlo, enw)
List(deew, abll, jno)
List(adej, blow, eln)

filteredCircledMap.foreach(println) // There are more than 60 rows return
(add,List((dad,4477)))
(aben,List((bean,6711)))
(elno,List((lone,9719)))
(aal,List((ala,8982)))
(dnow,List((down,310)))
(dlo,List((old,370)))

1 个答案:

答案 0 :(得分:1)

根据我从您的描述中理解,您需要遍历某种名为NSDateFormatter *input = [[NSDateFormatter alloc] init]; [input setDateFormat : @"HH:mm:ss"]; NSDateFormatter *output = [[NSDateFormatter alloc] init]; [output setDateFormat : @"hh:mm a"]; NSString *stringTime = @"14:23:00"; NSDate *dateTime = [input dateFromString:stringTime]; NSString *result = [output stringFromDate:dateTime]; NSLog(@"%@", result); 的列表结构列表,然后您有一个名为CircledCombinations的映射,用作从字符串到值的映射类型为int。

我假设filteredCircledMap是一个列表清单。此外,您的映射有点奇怪:它不应该是混淆类型,而应该更简单:CircledCombinations

你可以做什么而不是循环并以OOP风格来思考这个问题,同样以更实用的方式来解决这个问题:

Map[String, Int]

至少从我的问题中得到的结果是,每行的每个元素的计算得分(数值都是由我发明):

val scoresForEachRow: List[List[Int]] =
  CircledCombinations.map(_.map(filteredCircledMap(_).head._2))

然后,您可以映射函数List( List(2, 5, 4), List(5, 3, 1), // and so on... ) 以获得每行的总和:

sum

在那里,你最终会得到这个(上面的例子):

val sumForEachRow: List[Int] = scoresForEachRow.map(_.sum)

从这里,您可以通过以下方式计算最小值:

List(
  11,
  9,
  // and so on...
)

我认为你需要解决更多问题,但我认为这将有助于你迈出第一步。如果您愿意,可以使用val minimumVal: Int = sumForEachRow.min 跟踪字符串。

<强>更新

如果您还需要获得具有最小(或最大值)的字符串的实际列表,您可以使用zip

zip

然后,使用val sumsAndLists: List[List[String], Int] = scoresForEachRow.zip(sumForEachRow)

获得所需结果
minBy