복붙노트

[SCALA] 에 이동의 foreach는 방법에 현재 요소의 인덱스를 가져 오기?

SCALA

에 이동의 foreach는 방법에 현재 요소의 인덱스를 가져 오기?

내가 두 배열이 있다고 가정 :

val ar1 = Array[String]("1", "2", "3")
val ar2 = Array[String]("1", "2", "3", "4")

이제 AR1의 각 요소에 대해, 나는 다음 해당 AR2의 요소와와 요소는 결과를 인쇄하는 것이 첫 번째 연결하는 할 수 있습니다. 한 가지 방법 같은 것입니다 :

List.range(0, ar1.size).foreach(i => println(ar1(i)+ar2(i)))

나 정수 목록을 구성 먼저 AR1의 인덱스 대신 직접 작업 할 수 있도록 해주는 foreach는 변형이 있다면이되어 더 좋은있을 것입니다.

아마도 더 나은 방법은 무엇입니까?

해결법

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

    1.이 작업을 수행하는 한 가지 매우 편리한 방법은 튜플의 압축 방법입니다. 함수에 두 개의 인수를 얻을, 두 개의 컬렉션을 넣어!

    이 작업을 수행하는 한 가지 매우 편리한 방법은 튜플의 압축 방법입니다. 함수에 두 개의 인수를 얻을, 두 개의 컬렉션을 넣어!

    (ar1,ar2).zipped.foreach((x,y) => println(x+y))
    

    이것은 당신이 각 쌍을 저장하는 튜플을 구축 할 필요가 없기 때문에 당신이 다시 분해해야한다 (당신이 (AR1은 AR2)를 압축하는 것처럼) 모두 편리하고 빠르고 작성하는 것입니다. 우편 정지의 두 형태는 두 컬렉션의 짧은 수명이 다 할 때.

    당신이 뭔가 더 복잡있는 경우, 표준 솔루션은 인덱스의 압축이다 (예를 들어, 당신은 인덱스에 수학을 할 필요) :

    ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
    

    사용하는 방법은보다 신속하고 컴팩트하게 수행 다음 등의 유용 할 수 있습니다 :

    ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
    

    이에만 작동 있지만 첫 컬렉션은 더 이상 초보다없는 경우. 또한 explcitly 당신의 범위를 지정할 수 있습니다 :

    (0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
    

    이 문제를 해결하기 위해. (당신은 압축하여 무슨 일을하고하는 것은 너무 쉽게 일이에 대한 복잡하지 않으면 압축을 선호하는 이유를 확인할 수 있습니다.)

    이 병렬 수집하지 않습니다 (당신이에서 .par 전화하지 않는 한 보통이 아닌) 경우에는 변경 가능한 변수를 추적 할 수도 있지만 권장되지 않습니다 가능합니다 :

    { var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
    

    이 (당신이 다른 모음 (들)의 일부에 건너 뛰거나 역 추적 할 수있는 경우, 예를 들어) 필요한 경우 매우 제한된 수있다; 이 작업을 수행하는 것을 피할 수 있다면, 당신은 일반적으로 약 이유로 쉽게 코드를하게 될 겁니다.

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

    2.이 관용적 스칼라의 인덱스 방법 당신에게 루프 :

    이 관용적 스칼라의 인덱스 방법 당신에게 루프 :

    scala> List("A", "B", "C").zipWithIndex foreach { case(el, i) =>
         |   println(i + ": " + el)
         | }
    0: A
    1: B
    2: C
    

    그리고 여기에 코드에서 달성하려고하는 일을 할 수있는 관용적 스칼라 방법입니다 :

    scala> val arr1 = Array("1", "2", "3")
    arr1: Array[java.lang.String] = Array(1, 2, 3)
    
    scala> val arr2 = Array("1", "2", "3", "4")
    arr2: Array[java.lang.String] = Array(1, 2, 3, 4)
    
    scala> (arr1, arr2).zipped.map(_ + _) foreach println
    11
    22
    33
    
  3. ==============================

    3.나는 그것을 테스트 할 기회가 있었다하지 못했지만,이 트릭을 수행해야합니다

    나는 그것을 테스트 할 기회가 있었다하지 못했지만,이 트릭을 수행해야합니다

    ar1.zip(ar2).foreach(x => println(x._1 +x._2))
    
  4. ==============================

    4.지퍼는 그것을 할 것입니다 :

    지퍼는 그것을 할 것입니다 :

    ar1 zip ar2 foreach { p => println(p._1 + p._2) }
    

    이 얻을 것입니다 :

    11
    22
    33
    

    당신이 필요로하는 [문자열] 제네릭 형식, 컴파일러에 의해 유추됩니다하지 않는 것이 주 :

    val ar1 = Array("1", "2", "3")
    val ar2 = Array("1", "2", "3", "4")
    
  5. from https://stackoverflow.com/questions/6821194/get-index-of-current-element-in-a-foreach-method-of-traversable by cc-by-sa and MIT license