как отсортировать каждую строку в файле в Scala? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу отсортированный список имен, фамилия, имя, по одному в строке.Имена будут упорядочены по количеству символов в имени в порядке возрастания, начиная с самого короткого.В пределах каждой группы имен каждой длины они будут упорядочены по количеству символов в фамилии в порядке возрастания, самое короткое сначала.

Пример:

xxx xxxxx

ххх ххххх

ххх хххххх

ххх хххххх

хххх ххх

хххх ххххх

хххх ххххххх

iдобавить имя к списку списка, как этот список (список (Саманта, Сандерфур), список (Кэтлин, Ламоника), список (Дикси, Крукер), список (Домитила, Рутильяно))

и я хочу сортироватьэтот список списка.ИДК, как я должен отсортировать это, или каким-либо другим способом решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Вот как я бы это сделал:

val input = List(List("aa","bbb"), List("a", "bb"), List("aaaa", "b"), List("aa", "bb"))

val tupleInput = input.map{case List(a,b) => (a,b)} 
// List((aa,bbb), (a,bb), (aaaa,b), (aa,bb))

val sortedMapValues = tupleInput.groupBy(_._1).mapValues(_.sorted) 
// Map(a -> List((a,bb)), aaaa -> List((aaaa,b)), aa -> List((aa,bb), (aa,bbb)))

val sortedMapKeys = scala.collection.immutable.TreeMap(sortedMapValues.toArray:_*) 
// Map(a -> List((a,bb)), aa -> List((aa,bb), (aa,bbb)), aaaa -> List((aaaa,b)))

val result = sortedMapKeys.map{case (_, a) => a}

// result = List(List((a,bb)), List((aa,bb), (aa,bbb)), List((aaaa,b)))

Вы можете поиграть с ним здесь

Еще одно решение для одной строки может быть таким ( здесь ) - Спасибо @Anupam Kumar (необходимо сделать небольшую корректировку, чтобы его решение соответствовало требуемому вводу):

val result = input.sortBy{case List(x,y) => (x.length(),y.length())}

Спасибо @jwvh за то, что оно стало еще короче.

2 голосов
/ 17 июня 2019

попробуйте ниже код:

val names = List(("Jack","Wilson"),("Alex","Jao"),("Jack","Wildorsowman"),
    ("Jack","Wiliamson"),("Alex","Joan"),("Alex","J."))

println(names.sortBy( x => (x._1.length(),x._2.length())))

Результат:

List((Alex,J.), (Alex,Jao), (Alex,Joan), (Jack,Wilson), (Jack,Wiliamson), (Jack,Wildorsowman))

ОБНОВЛЕНО по предложению @GalNaor -

val names = `List(List("Jack","Wilson"),List("Alex","Jao"),List("Jack","Wildorsowman"),List("Jack","Wiliamson"),List("Alex","Joan"),List("Alex","J."))`

println(names.sortBy{ case List(x,y) => (x.length(),y.length())})

Результат:

List(List(Alex, J.), List(Alex, Jao), List(Alex, Joan), List(Jack, Wilson), List(Jack, Wiliamson), List(Jack, Wildorsowman))
0 голосов
/ 19 июня 2019

ребята, помогите мне.Я использую sortwith для сортировки списка, вот мой код

val s=v.sortWith((x,a)=>if(x(0).length==a(0).length){
  x(1).length<a(1).length
}
else{
  x(0).length<a(0).length
})
var z=""
for(i<- s){
  z=i(0)+" "+i(1)
  println(z)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...