2012-05-20 3 views
1

스칼라 컬렉션의 클래스를 찾고 있습니다.이 클래스를 사용하면 항목 목록의 다음 및 이전 요소로 이동할 수 있습니다. 예를 들어다음 및 이전 메서드가있는 스칼라 컬렉션 컨테이너

:

val container = SomeClassFromScala(Int,Double,classOf[String],7) 

container.getPreviousItem(Double) => Option[Int] 
container.getNextItem(7) => None 

는 GETNEXT/getPrevious이 API를 일정한 시간 스칼라 컬렉션 모든 클래스가있다.

코드를 작성할 수는 있지만 지금 당장 사용할 수있는 것이 있는지 알고 싶습니다.

+0

예제에서 보여주는 것은 단순히 양방향 탐색이 아니라 컬렉션에서 임의의 개체를 찾고 결국/이전 요소를 찾는 방법입니다. 예를 들어 두개의'Double' 객체가 있다면이 콜렉션은 어떻게 동작해야합니까? – paradigmatic

답변

0

DoubleLinkedList을 살펴보십시오. 이전 항목이 머리로 표시된 목록을 제공하는 prev을 추가합니다.

import collection.mutable.DoubleLinkedList 
val a = DoubleLinkedList(1,2,3,4) 
val b = a.next.next     // DoubleLinkedList(3, 4) 
val c = b.prev      // DoubleLinkedList(2, 3, 4) 

다운 사이드 : 일정 시간이 아니며 변경할 수 있습니다.

1

당신이 당신의 요구 사항을 불변의 콜렉션을 원한다면, 당신은 scalaz에서 Zipper 살펴 가질 수 있습니다

트랙 비어 있지 않은 지퍼와 같은 스트림 구조 인, 뾰족한 스트림을 제공합니다 스트림 내의 인덱스 (포커스) . 초점은 스트림을 통해 앞뒤로 이동할 수 있으며, 요소는 초점 위치 전후에 을 삽입 할 수 있으며 초점을 맞춘 항목은 삭제할 수 있습니다.

모든 작업은 일정 시간입니다. 상수는 객체 작성과 관련하여 배열을 래핑하는 요소 (요소의 삽입/삭제를 허용하지 않음)에서 기대할 수 있듯이 크기는 더 큽니다.

구현은 기본적으로 두 개의 목록 (Streams, 무엇이든간에)을 사용하여 이전의 역방향 요소를 보유합니다. 하나의 목록에서 다른 목록으로 헤드 요소를 스와핑하여 이동합니다.