我正在尝试使用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
}
答案 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)
如果数组碰巧是空的,您将得到无