- About Scala
- Documentation
- Code Examples
- Software
- Scala Developers
Xml elements out of order?
Fri, 2012-01-27, 23:30
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>
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>
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.