2009-10-23 15 views
5

OK, to pytanie wydaje się być naprawdę głupie, ale moim zdaniem, jeśli spojrzysz na API Scala 2.7.6, zrobili oni metodę wycofania z mapowania. Dlatego powinna istnieć bardziej elegancka alternatywa dla drukowania mapy w formacie niestandardowym. Ponieważ do prawie dowolnego celu, posiadanie metody równoważności mkString w Mapie jest naprawdę przydatne.Jak wydrukować mapę w Scali

Co o tym sądzisz? Jaki jest twój fragment kodu do drukowania mapy z wyjątkiem println?

Odpowiedz

3

Sposób mappingToString użyto, aby zmienić sposób każda para klucz/wartość była tłumaczona na String, który następnie używany metodą toString.

Myślę, że to kiepskie dopasowanie. Dodaje zmienność do niezmiennej struktury danych, na jedną rzecz. Jeśli masz określone wymagania dotyczące drukowania, prawdopodobnie lepiej jest umieścić je w innej klasie.

+0

dobry punkt na bycie niezmienne klasa! – Ekkmanz

2

mappingToString była specyficzna dla Map.

Dzięki nowej strukturze kolekcji w Scala2.8, Map może być iterowane przez dowolne IterableLike, które rozciąga się na TraversableLike.

Należy wtedy użyć metody mkstring (już w wersji 2.7 dla Iterable).

Zobacz ten blog post "Strings" by Jesse, do 2,7 mkstring() przykładów:

/* 
    Making use of raw strings to create a multi line string 
    I add a | at the beginning of each line so that we can line up the quote nicely 
    in source code then later strip it from the string using stripMargin 
*/ 
scala> val quote = """|I don-t consider myself a pessimist.                         
    |    |I think of a pessimist as someone who is waiting for it to rain. 
    |    |And I feel soaked to the skin. 
    | 
    |    |Leonard Cohen""" 
quote: java.lang.String = 
|I don-t consider myself a pessimist. 
         |I think of a pessimist as someone who is waiting for it to rain. 
         |And I feel soaked to the skin. 

         |Leonard Cohen 

// capilize the first character of each line 
scala> val capitalized = quote.lines. 
    |       map(_.trim.capitalize).mkString("\n") 
capitalized: String = 
|I don-t consider myself a pessimist. 
|I think of a pessimist as someone who is waiting for it to rain. 
|And I feel soaked to the skin. 

|Leonard Cohen 

// remove the margin of each line 
scala> quote.stripMargin   
res1: String = 
I don-t consider myself a pessimist. 
I think of a pessimist as someone who is waiting for it to rain. 
And I feel soaked to the skin. 

Leonard Cohen 

// this is silly. I reverse the order of each word but keep the words in order 
scala> quote.stripMargin.   
    |  lines.    
    |  map(_.split(" "). 
    |    map(_.reverse). 
    |    mkString (" ")). 
    |  mkString("\n") 
res16: String = 
I t-nod redisnoc flesym a .tsimissep 
I kniht fo a tsimissep sa enoemos ohw si gnitiaw rof ti ot .niar 
dnA I leef dekaos ot eht .niks 

dranoeL nehoC 
3

Można również łączyć Iterator.map() z mkString(), na przykład aby utworzyć kwerendę stringi z map[String,String]:

val queryString = updatedMap.map(pair => pair._1+"="+pair._2).mkString("?","&","")