2013-04-10 3 views
0

나는 스칼라 과정을하고 있으며, 하나의 과제에서 맞춤 목록의 끝에 추가하고 싶습니다.맞춤 목록의 끝에 추가

trait EntityList { 
    def head: Entity 
    def tail: EntityList 
    def isEmpty: Boolean 
} 

object Nil extends EntityList { 
    def head = throw new java.util.NoSuchElementException("head of EmptyList") 
    def tail = throw new java.util.NoSuchElementException("tail of EmptyList") 
    def isEmpty = true 
} 

class Cons(val head: Entity, val tail: EntityList) extends EntityList { 
    def isEmpty = false 
} 

나는이 목록의 시작 부분에 새로운 요소를 생성 추가하고 수행하여 새 목록을 만들 수 있습니다

new Cons(myNewElement, myExistingList) 

을하지만 어떻게 내가 새로운 요소가에 추가로 새로운 목록을 만들려면 어떻게해야합니까 맞춤 목록의 끝?

는 "증권"를

답변

4

(표준 라이브러리) 그러나 List

val l1 = List(1, 2, 3) 
l1: List[Int] = List(1, 2, 3) 

val l2 = l1 :+ 4 
l2: List[Int] = List(1, 2, 3, 4) 

val l3 = l2 ++ List(5, 6, 7, 8) 
l3: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8) 

, 당신은 종단 A 단점 셀리스트의 다음과 같은 새로운 요소를 추가하려고 신중하게 결과를 고려해야한다 List (및 "사용자 정의"목록), 이는 매우 비효율적이기 때문에. 이 결과를 원할 때 종종 역순으로 원하는 목록을 생성하는 재귀 알고리즘을 작성합니다 (효율적인 작업을 수행하고 새로 생성 된 요소를 누적 목록의 머리글에 추가하기 때문에). 그런 다음 모든 작업이 완료되면 올바른 순서를 얻기위한 역방향 목록. 스칼라의 List의 미묘한의 없음과 초등학교 단점 셀 목록은 "사용자 정의"목록

를 들어

, 당신은 단지 정면에서 구축 할 수 있습니다. 이 경우 앞쪽에 새 요소를 추가하여 목록을 구성한 다음 (수행 할 수있는 유일한 방법) reverse 알고리즘을 작성하여 필요한 순서로 목록을 가져옵니다.

부록

내가 정말 질문에 대답하지 않았다 같아요. 목표/요구 사항이 끝에 새로운 요소를 추가하는 것이라면, 그 요소 만 포함하고 새로운 요소를 하나씩 (재귀 적으로) 기존 목록 의 각 요소 앞에 붙입니다. 꼬리 재귀 구현에서이 작업을 수행하는 것이 가장 이상적입니다. 시작하기 전에 추가 작업의 비효율을 이해하지 못했다면 일단 작업을 완료하게됩니다.