복붙노트

[SCALA] 스칼라 : 캔 내가 설정 항목의 순서에 의존?

SCALA

스칼라 : 캔 내가 설정 항목의 순서에 의존?

이것은 매우 불쾌한 놀람이었다 :

scala> Set(1, 2, 3, 4, 5)       
res18: scala.collection.immutable.Set[Int] = Set(4, 5, 1, 2, 3)
scala> Set(1, 2, 3, 4, 5).toList
res25: List[Int] = List(5, 1, 2, 3, 4)

그 자체로이 예제는 내 질문에 "아니오"대답을 제시하지 않습니다. 그리고 무엇 ListSet 어떻습니까?

scala> import scala.collection.immutable.ListSet
scala> ListSet(1, 2, 3, 4, 5)
res21: scala.collection.immutable.ListSet[Int] = Set(1, 2, 3, 4, 5)

이 사람은 작동하는 것 같다,하지만 난이 동작에 의존해야합니까? 원래 순서가 보존되어야 고유 항목, 불변 컬렉션에 적합한 어떤 다른 데이터 구조?

그런데, 나는 목록에서 중복하지 방법에 대해 알고있다. 문제는 인터페이스 수준에서 (순서를 유지하면서) 나는 나의 깔끔한 디자인까지 별개의 것 난장판을 사용하여 항목의 고유성을 강제하려는 것입니다 ..

편집하다

ListSet 역시 매우 안정적인하지 않는 것 같습니다 :

scala> ListSet(1, 2, 3, 4, 5).toList
res28: List[Int] = List(5, 4, 3, 2, 1)

Aaditi

나는이 시도 완벽한 디자인에 대한 내 검색 :

scala> class MyList[A](list: List[A]) { val values = list.distinct }
scala> implicit def toMyList[A](l: List[A]) = new MyList(l)
scala> implicit def fromMyList[A](l: MyList[A]) = l.values     

어떤 실제로 작동 :

scala> val l1: MyList[Int] = List(1, 2, 3)
scala> l1.values
res0: List[Int] = List(1, 2, 3)

scala> val l2: List[Int] = new MyList(List(1, 2, 3))
l2: List[Int] = List(1, 2, 3)

그러나 문제는, 내가 라이브러리 이외의 myList에 노출하고 싶지 않은 것입니다. 오버라이드 (override) 할 때 암시 적 변환을 할 수있는 방법이 있습니까? 예를 들면 :

trait T { def l: MyList[_] }
object O extends T { val l: MyList[_] = List(1, 2, 3) }
scala> O.l mkString(" ")  // Let's test the implicit conversion
res7: String = 1 2 3      

나는 이런 식으로 작업을 수행하고 싶습니다 :

object O extends T { val l = List(1, 2, 3) }  // Doesn't work

해결법

  1. ==============================

    1.당신이 세트의 순서에 의존해서는 안 나의 신념이다. 어떤 언어에서.

    당신이 세트의 순서에 의존해서는 안 나의 신념이다. 어떤 언어에서.

    그 외에도, 깊이 이것에 대해 이야기이 질문에 봐.

  2. ==============================

    2.그것은 당신이 사용하는 설정에 따라 달라집니다. 당신은 당신이 가지고있는 설정 구현 알 수없는 경우, 다음 대답은 더 당신이 확신 할 수 없다, 단순히 없습니다. 실제로 나는 보통 다음 세 가지 사례가 발생 :

    그것은 당신이 사용하는 설정에 따라 달라집니다. 당신은 당신이 가지고있는 설정 구현 알 수없는 경우, 다음 대답은 더 당신이 확신 할 수 없다, 단순히 없습니다. 실제로 나는 보통 다음 세 가지 사례가 발생 :

    이 모든 Java는 TreeSet에, LinkedHashSet의 및 HashSet의와 해당 인터페이스 SortedSet에, 대등 일반 설정을 가지고뿐만 아니라 자바에 적용됩니다.

  3. ==============================

    3.이 목록에 의해 뒷받침되기 때문에 ListSet 항상 삽입의 역순으로 요소를 반환하고, 목록에 요소를 추가 할 수있는 최적의 방법을 붙이는 것입니다.

    이 목록에 의해 뒷받침되기 때문에 ListSet 항상 삽입의 역순으로 요소를 반환하고, 목록에 요소를 추가 할 수있는 최적의 방법을 붙이는 것입니다.

    먼저 첫번째 밖으로 (큐)에서 원하는 경우 불변의 데이터 구조는 문제가있다. 당신은 O (logn) 또는 상각 O (1)을 얻을 수 있습니다. 세트를 구축하고 그것에서 반복자를 생산하는 명백한 필요성을 감안할 때, 나는 그것을 상환 할 수있는 방법이 표시되지 않습니다 (즉, 먼저 모든 요소를 ​​넣어 것입니다, 당신은 모든 요소를 ​​제거 할 수 있습니다).

    당신은 ListSet 항상 순서에서 첫 번째, 마지막에에 (스택) 요소를 반환 할 것을 의존 할 수 있습니다. 수 있으면 경우에, 그것을 위해 이동합니다.

  4. from https://stackoverflow.com/questions/5245713/scala-can-i-rely-on-the-order-of-items-in-a-set by cc-by-sa and MIT license