使用整数键对scala hashmap排序不起作用

时间:2018-09-09 17:38:37

标签: scala sorting hashmap

我正在尝试使用Scala中的HashMap列出数组对象中的最新文件。 关键是文件号,值是文件名。当我按键对哈希表进行排序时,它似乎总是返回插入的第一个文件名。因此,x始终返回"hdfs://localhost:8020/transactions/transaction_8.txt"

import scala.collection.mutable.HashMap
import scala.concurrent.Future
import scala.util.matching.Regex
import scala.util.{Failure, Success, Try}

val status = Array("hdfs://localhost:8020/transactions/transaction_8.txt", "hdfs://localhost:8020/transactions/transaction_8.txt", "hdfs://localhost:8020/transactions/transaction_7.txt", "hdfs://localhost:8020/transactions/transaction_10.txt", "hdfs://localhost:8020/transactions/transaction_9.txt")

      var x = ""
      var newFile: String = ""
      val hMap: HashMap[Int, String] = HashMap.empty[Int, String]
      if (!status.isEmpty) {
        for (e ← status) {
          val counter = Try { e.toString.split("_")(1).split("\\.")(0) }.getOrElse("1")
          hMap.put(counter.toInt, e.toString)
        }
        x = HashMap(hMap.toSeq.sortWith(_._1 > _._1): _*).head._2
        }

2 个答案:

答案 0 :(得分:2)

您不需要为此设置地图,更不用说可变了。也不需要排序。 这样的事情应该可以满足您的要求:

val x = status.minBy { _.replaceAll(".*_(\\d+).*", "$1").toInt }

答案 1 :(得分:0)

正如@Dima所建议的,您可以使用minBy,但要谨慎使用。当status为空列表时,该方法将引发异常。

java.lang.UnsupportedOperationException: empty.minBy

考虑到这一点,也许您可​​以使用 sortBy 方法,将其与 headOption 组合:

status.sortBy(_.replaceAll(".*_(\\d+).*", "$1").toInt).headOption

因此,使用给定的数组,结果将是

Some(hdfs://localhost:8020/transactions/transaction_7.txt)

如果数组碰巧是空的,您将得到