Scala: использование значения из массива для поиска в другом массиве - PullRequest
0 голосов
/ 21 мая 2018

У меня есть два массива:

GlobalArray:Array(Int,Array[String]) и SpecificArray:Array(Int,Int).

Первый Int в обоих из них является ключом, и я хотел бы получить элемент, соответствующий этому ключу, из GlobalArray.

В псевдокоде:

val v1
For each element of SpecificArray
    Get the corresponding element from GlobalArray to use its Array[String]
         If (sum <= 100)
             for each String of the Array
                 update v1 
                 // ... some calculation
                 sum += 1

println (v1)

Я знаю, используя .map(), я мог пройти через каждую позицию SpecificArray, но до сих пор я мог это сделать:

SpecificArray.map{x => val in_global = GlobalArray.filter(e => (e._1 == x._1))
                       // I don't know how to follow
                  }

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Примечание нуждается в дополнительной оптимизации

Преобразование GlobalArray в Map для более быстрого поиска.

val GlobalMap = GlobalArray.toMap

SpecificArray.flatMap(x => GlobalMap(x._1))
.foldLeft(0)((sum:Int, s:String) => {
    if(sum<=100) {
    // update v1
    // some calculation
    }
    sum+1
})

Если не все ключи SpecificArray присутствуют в GlobalMap, используйте GlobalMap.getOrElse(x._1, Array())

0 голосов
/ 21 мая 2018

Как насчет чего-то подобного ниже, я бы предпочел for код понимания, который лучше читается.

var sum:Int = 0
var result:String = ""
for {
  (k1,v1) <- SpecificArray //v1 is the second int from specific array
  (k2,values) <- GlobalArray if k1 == k2  //values is the second array from global array
  value  <- values if sum < 100  //value is one value frome the values
   _ = {sum+=1; result += s"(${v1}=${value})"} //Update something here with the v1 and value
 } yield ()

println(result)
0 голосов
/ 21 мая 2018

Как sum влияет на логику, и что именно является v1, неясно из вашего кода, но похоже, что вы просматриваете GlobalArray много раз.Если это так, имеет смысл преобразовать этот массив в более удобную для поиска структуру данных: Map.Вы можете сделать это следующим образом

val globalMap = GlobalArray.toMap

, а затем вы можете использовать, чтобы соединить строки следующим образом:

println(SpecificArray.flatMap({case (k,v) => globalMap(k).map(s => (k,v,s))}).toList)

Если вам нужны только строки, вы можете использовать только

println(SpecificArray.flatMap({case (k,v) => globalMap(k)}).toList)

Обратите внимание, что в этом коде предполагается, что для каждого ключа в SpecificArray будет соответствующий ключ в GlobalArray.Если это не так, вам следует использовать другой метод для доступа к Map, например getOrElse:

println(SpecificArray.flatMap({case (k,v) => globalMap.getOrElse(k, Array()).map(s => (k,v,s))}).toList)

Обновление

Если sumна самом деле count и работает для целых «соединенных» данных, а не для каждого ключа в SpecificArray, вы можете использовать take вместо него.Код будет выглядеть так:

val joined = SpecificArray2.flatMap({case (k,v) => globalMap.getOrElse(k, Array()).map(s => (s,v))})
        .take(100) // use take instead of sum

И тогда вы можете использовать joined так, как захотите.И обновленная демонстрация, которая создает v1 как объединенную строку формы v1 += String_of_GlobalArray + " = " + 2nd_Int_of_SpecificArray, здесь .Идея состоит в том, чтобы использовать mkString вместо явного обновления переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...