This page is no longer maintained — Please continue to the home page at www.scala-lang.org

Xml elements out of order?

1 reply
daveclay
Joined: 2012-01-27,
User offline. Last seen 42 years 45 weeks ago.
This seems wrong to me - the xml generated from an ordered TreeSet is out of order. Is this expected?

scala> var list = collection.immutable.TreeSet(1, 3, 2, 5, 0)
list: scala.collection.immutable.TreeSet[Int] = TreeSet(0, 1, 2, 3, 5)

scala> var xml = <list>{ list.map(number => { <number>{number}</number> }) }</list>
xml: scala.xml.Elem = <list><number>3</number><number>1</number><number>2</number><number>5</number><number>0</number></list>

scala> var xml = <list>{ list.map(number => { println(number); <number>{number}</number> }) }</list>
0
1
2
3
5
xml: scala.xml.Elem = <list><number>3</number><number>1</number><number>2</number><number>5</number><number>0</number></list>


Alex Cruise
Joined: 2008-12-17,
User offline. Last seen 2 years 26 weeks ago.
Re: Xml elements out of order?
On Fri, Jan 27, 2012 at 2:30 PM, daveclay <daveclay@gmail.com> wrote:
This seems wrong to me - the xml generated from an ordered TreeSet is out of order. Is this expected?

scala> var list = collection.immutable.TreeSet(1, 3, 2, 5, 0)
list: scala.collection.immutable.TreeSet[Int] = TreeSet(0, 1, 2, 3, 5)

scala> var xml = <list>{ list.map(number => { <number>{number}</number> }) }</list>
xml: scala.xml.Elem = <list><number>3</number><number>1</number><number>2</number><number>5</number><number>0</number></list>

It's because TreeSet.map[A](f: A => B) where B doesn't have an Ordering in scope will give you a HashSet, not a TreeSet[1].  If you do TreeSet.toSeq.map it should do what you expect.  Alternatively, define an ordering over Elem, but...you probably don't want to do that. :)
-0xe1a
1: It's because TreeSet's "best" CanBuildFrom  (defined in SortedSetFactory) requires an Ordering.  Failing that, the compiler looks "up", and the next best thing is a generic Set builder, which uses HashSets.

Copyright © 2012 École Polytechnique Fédérale de Lausanne (EPFL), Lausanne, Switzerland