Scala Почему я получаю несоответствие типа с hashmap?

#scala

Вопрос:

Я получаю несоответствие типа здесь? Разве я не создаю хэш-карту ключевого символа и значения int? Я что, какой-то итератор вместо int?

 import scala.collection.mutable.HashMap

object Solution {
    def firstUniqChar(s: String): Int = {
        var hashMapName =        HashMap[Char, Int]();
        for (i <- 0 until s.length){
             if (hashMapName.contains(s.charAt(i)) ) return i-1
            else hashMapName = hashMapName   (s.charAt(i), i)
            println(s.charAt(i))
        }
        return -1;
    }
}
 

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

1. В качестве дополнительного замечания, уверены ли вы в этой реализации? Похоже, это возвращает первый неуникальный символ, который, по-видимому, не соответствует названию метода.

2. Пожалуйста, не смешивайте изменяемую коллекцию с изменяемой переменной, используйте любую из них.

3. Однострочное решение: def firstUniqChar(s: String): Int = s.indexWhere(c => s.lastIndexOf(c) == s.indexOf(c))

Ответ №1:

В Scala все является вызовом метода, включая то, что выглядит как операторы.

Это означает, что

 hashMapName   (s.charAt(i), i)
 

является неоднозначным для синтаксического анализатора, потому что неясно, используете ли вы синтаксис оператора или синтаксис метода, который был бы

 hashMapName. (s.charAt(i), i)
 

Чтобы исправить ошибку, вам необходимо добавить дополнительную пару круглых скобок, чтобы уточнить, что вы пытаетесь вызвать не метод с двумя аргументами, а метод с одним аргументом, который является парой

 hashMapName   ((s.charAt(i), i))
 

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

1. о, боже мой! Может быть, я больше не в ладах со скалой, чем мне показалось сначала.

2. @GarrettPeuse другим вариантом было бы hashMapName (s.charAt(i) -> i)

3. @MeditationOrBust Не волнуйся! Scala сильно отличается от Java, C# и т. Д. Компилятор scalac чрезвычайно сложен и обладает таким богатством; он требует много чтения и практики, чтобы «почувствовать». Не сдавайтесь, вы будете вознаграждены.