получить индексы элементов, содержащих некоторое значение, и соответствующие элементы из другого списка - PullRequest
0 голосов
/ 28 июня 2018

Квестон - глоток, но идея довольно проста.

У меня есть 3 списка и строка.

val a = List("x", "y", "z")
val b = List("a1", "a2", "b1", "b2", "c1", "c2", "d1", "d2")
val c = List("1", "1", "2", "2", "3", "3", "4", "4")
val d = "xc1b1"

Мне нужно проверить, содержит ли d элементы из a. Если это так, я проверяю положение всех элементов из b, которые присутствуют в d, и возвращаю набор элементов из c, который отвечает за эти позиции.

Результат для данного примера:

Set("3", "2")

Но когда я пытаюсь

if(a.exists(d.contains)) c(b.indexWhere(d.contains))

Я только получаю

Any = 2

Какое ядро ​​соответствует первому найденному элементу из b, т. Е. b1

Как бы мне получить комплект?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Мне кажется, я понял, что вам нужно сделать здесь, хотя вопрос можно сделать с некоторыми пояснениями.

Вот два способа добраться до вашего устройства, которые я нашел:

if(a.exists(d.contains)) b.collect { case x if d.contains(x) => c(b.indexOf(x)) }.toSet

if(a.exists(d.contains)) b.filter(d.contains).map(b.indexOf).map(c).toSet

Оба находят элементы b, находящиеся в d, затем находят их индекс в b и находят их относительные элементы в c. Первый способ более точен в том, что он делает, а второй - более лаконичен.

0 голосов
/ 28 июня 2018

-

if(a.exists(d.contains)) b.zip(c).collect{ 
    case (x, y) if d.contains(x) => y 
}
// res1: Any = List(2, 3)

Если вам нужен набор:

if(a.exists(d.contains)) b.zip(c).collect{ 
    case (x, y) if d.contains(x) => y 
}.toSet
// res2: Any = Set(2, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...