Как узнать, содержит ли массив значение из другого списка Java в Scala?

#scala

#scala

Вопрос:

У меня есть 1 массив Scala, содержащий строки, и 1 список Java Util, содержащий строки. Я хочу проверить, находится ли значение одного массива в другом списке, и установить соответствующий флаг.

 def getFlag(JavaList, scalaArray): Boolean = {
  val res = JavaList.toArray.filter(x => scalaArray.contains(x))

  if (res.isEmpty)
    false
  else 
    true
}
  

похоже, что contains не работает. Он всегда показывает размер как 0, даже если должна быть соответствующая строка, и я не уверен, почему.

Как бы мне это исправить или есть какие-либо другие лучшие методы для этого? Я пытаюсь лучше ознакомиться со Scala, любая помощь приветствуется, спасибо

Комментарии:

1. Не могли бы вы распечатать JavaList и scalaArray перед фильтрацией? И, возможно JavaList.toArray ? Спасибо.

2. Кстати, нет необходимости создавать переменную с именем res , затем проверять, пуста ли она в операторе if, и возвращать true или false вручную. Вы могли бы просто вернуть res.isEmpty или записать все это в одной строке

Ответ №1:

Я бы использовал exists и преобразовал массив в набор, чтобы ускорить проверку.

 // This one for 2.13 
import scala.jdk.CollectionConverters._
// This one for 2.12-
import scala.collection.JavaConverters._

def getFlag(javaList: java.util.List[String], scalaArray: Array[String]): Boolean = {
  val values = scalaArray.toSet
  javaList.asScala.exists(values.contains)
}
  

Если вы получаете false , то в строках есть некоторые ошибки, возможно, попробуйте преобразовать их в нижний регистр или проверить, есть ли там невидимые символы.


Я пытаюсь лучше ознакомиться со Scala, любая помощь приветствуется, спасибо

Мой лучший совет — держаться подальше от коллекций Java и от plain Arrays . Вместо этого используйте коллекции из библиотеки Scala, такие как: List , Vector , ArraySeq , Set Map , , и т.д.