Я отчаянно пытаюсь найти способ сортировки списка строк, где строки являются предопределенными идентификаторами следующего вида: a1.1, a1.2, ..., a1.100, a2.1, a2. 2, ...., a2.100, ..., b1.1, b1.2, .. и т. Д., Что уже соответствует правильному порядку. Таким образом, каждый идентификатор сначала упорядочен по своему первому символу (по убыванию в алфавитном порядке), а в этом порядке по убыванию упорядочен по порядковым номерам. Я пробовал sortWith, предоставив функцию сортировки, указав вышеуказанное правило для всех двух последовательных членов списка.
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => a.take(1) < b.take(1) && a.drop(1).toDouble < b.drop(1).toDouble)
res2: List[java.lang.String] = List(a1.102, a1.1, b2.2, b2.1)
Это не тот порядок, который я ожидал. Однако, меняя порядок выражений как
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => (a.drop(1).toDouble < b.drop(1).toDouble && a.take(1) < b.take(2)))
res3: List[java.lang.String] = List(a1.1, a1.102, b2.1, b2.2)
это действительно дает мне (по крайней мере, для этого примера) желаемый порядок, который я тоже не понимаю.
Я был бы очень благодарен, если бы кто-нибудь дал мне подсказку, что именно там происходит и как я могу сортировать списки по своему желанию (с более сложным логическим выражением, чем только сравнение <или>). Еще один вопрос: строки, которые я сортирую (в моем примере), на самом деле являются ключами из HashMap m. Любое решение повлияет на сортировку m по ключам в пределах
m.toSeq.sortWith((a: (String, String), b: (String, String)) => a._1.drop(1).toDouble < b._1.drop(1).toDouble && a._1.take(1) < b._1.take(1))
Большое спасибо заранее!