#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
, , и т.д.