>

다음과 같은 항목 목록이 있다고 가정합니다.

val utils: Seq[Utilities] = {
  Seq(
    Utilities("jackhammer", 24, "Industrial item", "For sale", "Available"),
    Utilities("axe",        19, "Home item",       "For sale", "Available"),
    Utilities("pick",       39, "Garage item",     "For sale", "Not Available")
  )
}

Utilities 의 스켈레톤 클래스  다음과 같습니다 :

final case class Utilities(item_name: String, ref_id: Int, 
                           item_type: String, sale_status: String, status: String)

우리는 또한 Utilities 의 현재 판매 상태에 대한 다른 아이템 목록을 가지고 있습니다 : (이 수업은 Utilities 와 관련이 없습니다. , 두 번째 열만 유틸리티에 적용하는 것을 목표로합니다.)

val newAttr: Seq[NewAttributes] = {
      Seq(
        NewAttributes(1,  "For sale"),
        NewAttributes(3,  "Not for sale"),
        NewAttributes(18, "Discontinued")
      )
    }

NewAttributes 의 스켈레톤 클래스  다음과 같습니다 :

final case class NewAttributes(r_id: Int, status: String)

Utilities 를 교체하는 방법 ' sale_status NewAttributes 기록   status 순서대로?

새로운 업데이트 Utilities  다음과 같아야합니다 :

Utilities("jackhammer", 24, "Industrial item", "For sale",     "Available")
Utilities("axe",        19, "Home item",   "Not for sale", "Available")
Utilities("pick",       39, "Garage item", "Discontinued", "Not Available")

newAttr 에서 요소를 성공적으로 검색하고 있습니다.  다음 코드를 사용하지만 utils 에 적용하는 방법을 모르겠습니다.  위의 스키마를 달성하십시오.

val prepStatuses = 
   for(na <- newAttr)
      yield na.status

어떤 도움이라도 대단히 감사합니다!


  • 답변 # 1

    주문이 정확하면 다음과 같습니다.

     final case class Utilities(item_name: String, ref_id: Int, item_type: String, sale_status: String, status: String)
      val utils: Seq[Utilities] = {
        Seq(
          Utilities("jackhammer", 24, "Industrial item", "For sale", "Available"),
          Utilities("axe", 19, "Home item", "For sale", "Available"),
          Utilities("pick", 39, "Garage item", "For sale", "Not Available")
        )
      }
      final case class NewAttributes(r_id: Int, status: String)
      val newAttr: Seq[NewAttributes] = {
        Seq(
          NewAttributes(1, "For sale"),
          NewAttributes(3, "Not for sale"),
          NewAttributes(18, "Discontinued")
        )
      }
      utils.zip(newAttr).map{ case(utility, newAttribute) =>
          utility.copy(sale_status = newAttribute.status)
      }
    
    

  • 답변 # 2

    필요한 데이터를 찾는 방법이 필요합니다 :

    def findStatus(id: Int): Option[String] = 
      newAttr.find(_.r_id == id).map(_.status)
    
    

    그리고 이해하기 위해 그것을 사용해야합니다 :

    val mappedUtils = for(u <- utils)
      yield u.copy(sale_status = findStatus(u.ref_id).getOrElse(sys.error(s"No such id ${u.ref_id}")))
    
    

  • 답변 # 3

    index 를 간단히 매핑 할 수 있습니다  유틸리티를 copy 에  sale_status가 수정 된 해당 utils 요소 :

    utils.indices.map(i => utils(i).copy(sale_status = newAttr(i).status))
    
    

  • 답변 # 4

    zipWithIndex 를 사용하여 요구 사항을 달성 할 수 있습니다

    val zippedNewAttr = newAttr.zipWithIndex.map(_.swap).toMap
    val result = for(x <- utils.zipWithIndex; y = zippedNewAttr(x._2))yield Utilities(x._1.item_name, x._1.ref_id, x._1.item_name, y.status, x._1.status)
    
    

    설명 :
    zipWithIndex는 첫 번째 값이 원래 값이고 두 번째 값이 각 값의 인덱스 인 Tuple2를 생성합니다. 예를 들어 newAttr.zipWithIndex  생산합니다

     (NewAttributes(1, "For sale"),1)
      (NewAttributes(3, "Not for sale"),2)
      (NewAttributes(18, "Discontinued"),3)
    
    

    _.swap  위에서 생성 된 tuple2 값을 교환하고 .toMap은 각 Tuple2 레코드에 대해 맵을 생성하므로 zippedNewAttr  

     (1 -> NewAttributes(1, "For sale"))
      (2 -> NewAttributes(3, "Not for sale"))
      (3 -> NewAttributes(18, "Discontinued"))
    
    

    for 루프Utilities 를 생성합니다  대체 된 유틸리티 sale_status개체를 다시  NewAttributes status 로 기록 zipWithIndex는 순서를 유지합니다.

    업데이트

    반복자를 사용하는 또 다른 더 좋은 방법이 있습니다

    val utilsIterator = utils.iterator
    val newAttrIterator = newAttr.iterator
    val result = ArrayBuffer.empty[Utilities]
    while(utilsIterator.hasNext && newAttrIterator.hasNext){
      val utils = utilsIterator.next()
      val newAttr = newAttrIterator.next()
      result.append(Utilities(utils.item_name, utils.ref_id, utils.item_type, newAttr.status, utils.status))
    }
    
    

    result  필수 출력입니다

관련 자료

  • 이전 java - 프록시를 초기화 할 수 없습니다 - spring 인터셉터 내부 세션 없음
  • 다음 bash - 여유 공간이있는 여러 줄 문자열 (보존 들여 쓰기)