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)))
이 문제를 해결하기 위해. (당신은 이유를 볼 수 zip
와 zipped
무슨 일을하고하는 것은 너무 쉽게 일이에 대한 복잡하지 않는 것이 바람직하다.)
병렬 컬렉션이 아닌 경우 (일반적으로를 호출하지 않는 한 그렇지 않은 경우 .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")
'development' 카테고리의 다른 글
Ajax 호출에서 세션 시간 초과 처리 (0) | 2020.12.28 |
---|---|
iOS의 키 체인에 이메일 / 비밀번호 저장 (0) | 2020.12.28 |
Slim PHP 및 GET 매개 변수 (0) | 2020.12.28 |
html에서 ► 재생 (앞으로) 또는 단색 오른쪽 화살표 기호를 어떻게 표시합니까? (0) | 2020.12.28 |
Android에서 View Stub을 사용하는 방법 (0) | 2020.12.28 |