development

Traversable의 foreach 메서드에서 현재 요소의 인덱스를 가져 오나요?

big-blog 2020. 12. 28. 22:28
반응형

Traversable의 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)))

정수 목록을 먼저 구성하는 대신 foreach인덱스로 직접 작업 할 수 있는 변형이 있다면 더 좋았을 것 ar1입니다.

더 좋은 방법이 있을까요?


이를 수행하는 한 가지 매우 편리한 zipped방법은 튜플에 대한 메서드를 사용하는 것입니다. 두 개의 컬렉션을 넣고 함수에 대한 두 개의 인수를 가져옵니다!

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

작성하기 편리하고 빠르다. 각 쌍을 저장하기 위해 튜플을 만들 필요가 없기 때문에 (에서와 같이 (ar1 zip ar2)) 다시 분해해야한다. 두 컬렉션 중 더 짧은 컬렉션이 소진되면 두 가지 형태의 지퍼가 중지됩니다.

더 복잡한 것이있는 경우 (예 : 인덱스에서 수학을해야 함) 표준 솔루션은 인덱스를 압축하는 것입니다.

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

사용중인 방법은 다음과 같이보다 빠르고 간결하게 수행되며 유용 할 수 있습니다.

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

첫 번째 컬렉션이 두 번째 컬렉션보다 길지 않은 경우에만 작동합니다. 범위를 명시 적으로 지정할 수도 있습니다.

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

이 문제를 해결하기 위해. (당신은 이유를 볼 수 zipzipped무슨 일을하고하는 것은 너무 쉽게 일이에 대한 복잡하지 않는 것이 바람직하다.)

병렬 컬렉션이 아닌 경우 (일반적으로를 호출하지 않는 한 그렇지 않은 경우 .par), 권장되지는 않지만 변경 가능한 변수로 추적하는 것도 가능합니다.

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

이것이 필요한 경우는 매우 제한적입니다 (예 : 다른 컬렉션의 일부를 건너 뛰거나 뒤로 이동하려는 경우); 이 작업을 피할 수 있다면 일반적으로 추론하기 쉬운 코드로 끝납니다.


다음은 관용적 Scala에서 인덱스를 사용하여 반복하는 방법입니다.

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

다음은 코드에서 달성하려는 작업을 수행하는 관용적 Scala 방법입니다.

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

나는 그것을 테스트 할 기회가 없었지만 이것은 트릭을 할 것입니다.

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

zip 그것을 할 것입니다 :

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

결과는 다음과 같습니다.

11
22
33

[String]제네릭 유형이 필요하지 않으며 컴파일러에 의해 유추됩니다.

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

참조 URL : https://stackoverflow.com/questions/6821194/get-index-of-current-element-in-a-foreach-method-of-traversable

반응형