[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.이 작업을 수행하는 한 가지 매우 편리한 방법은 튜플의 압축 방법입니다. 함수에 두 개의 인수를 얻을, 두 개의 컬렉션을 넣어!
이 작업을 수행하는 한 가지 매우 편리한 방법은 튜플의 압축 방법입니다. 함수에 두 개의 인수를 얻을, 두 개의 컬렉션을 넣어!
(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.이 관용적 스칼라의 인덱스 방법 당신에게 루프 :
이 관용적 스칼라의 인덱스 방법 당신에게 루프 :
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.나는 그것을 테스트 할 기회가 있었다하지 못했지만,이 트릭을 수행해야합니다
나는 그것을 테스트 할 기회가 있었다하지 못했지만,이 트릭을 수행해야합니다
ar1.zip(ar2).foreach(x => println(x._1 +x._2))
-
==============================
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")
from https://stackoverflow.com/questions/6821194/get-index-of-current-element-in-a-foreach-method-of-traversable by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 메모이 제이션 : 어떻게이 스칼라 메모 작동합니까? (0) | 2019.11.19 |
---|---|
[SCALA] 스칼라에서 튜플에 케이스 클래스를 변환하는 쉬운 방법은 무엇입니까? (0) | 2019.11.19 |
[SCALA] 왜리스트 나쁜에 추가된다? (0) | 2019.11.19 |
[SCALA] 어떻게 스칼라 / SBT / SLF4J 프로젝트에서 평민 로깅을 제외하려면? (0) | 2019.11.19 |
[SCALA] 왜 기능은 [-A1, ..., + B]되지 매개 변수와 같은 슈퍼 타입을 허용 어떻습니까? (0) | 2019.11.19 |