Сортировка хеш-карты scala с использованием целочисленной клавиши не работает - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь перечислить последний файл в объекте массива, используя HashMap в Scala. Ключ - номер файла, а значение - имя файла. Когда я сортирую хэш-карту по ключу, он всегда возвращает первое имя файла, которое было вставлено. Таким образом, х всегда возвращает "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 голосов
/ 10 сентября 2018

Как подсказывает @Dima, вы можете использовать minBy, но используйте его с осторожностью. Этот метод генерирует исключение, когда статус представляет собой пустой список.

java.lang.UnsupportedOperationException: empty.minBy

Учитывая, что, возможно, вы могли бы использовать метод sortBy , комбинируя его с headOption :

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

Итак, используя заданный вами массив, результат будет

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

И если массив окажется пустым, вы получите Нет

0 голосов
/ 09 сентября 2018

Вам не нужна карта для этого, не говоря уже о изменяемой.Сортировка тоже не нужна.Что-то вроде этого должно делать то, что вы хотите:

val x = status.minBy { _.replaceAll(".*_(\\d+).*", "$1").toInt }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...