Ошибка несоответствия типов с For L oop и Tuple TreeSet - PullRequest
0 голосов
/ 04 февраля 2020

Я новый Scala программист, и я столкнулся с проблемой. Я пишу функцию для получения числа. Когда я пытаюсь получить значение из моего для l oop (около дна, инкапсулированного в операторе If / Else), это дает мне ошибку несоответствия типов. Я ожидаю кортеж TreeSet с String и Int (scala .collection.mutable.TreeSet [(String, Int)]), но он говорит, что возвращает Unit.

Вот мои инструкции для это, и я считаю, что если я исправлю эту ошибку, она должна работать.

"Примечание: тип возвращаемого значения - это TreeSet кортежей, имеющих тип (String, Int). Например, с учетом списка людей Список («Том», «Энн», «Роб», «Роб», «Энн», «Том», «Пэт», «Роб», «Пат», «Том») ваша функция должна возвращать TreeSet ((Том, ​​3 ), (rob, 3)). Примечание: для самого большого мошенника в ie необходимо вернуть все самые большие мошенники в наборе. Список, имена которого появляются только один раз, возвращает пустой TreeSet. "

*** Функции «обманщики» и «а» определены в других местах, которые не показаны.

  def biggestCrooks(people: List[String]): TreeSet[(String,Int)] = {

    val crooksListed = crooks(people).toList //Runs my one function that gives me the
                                         // list of criminals with more than one offense

    var numCounted = new Array[Int](crooksListed.size) // Array to hold the number of times a person name 
                                                       //appears

    for(nameIndex <- 0 until crooksListed.size){ // Counts the number of times a name appears
      val counter = people.count(_.equals(crooksListed(nameIndex))) //Stores that name in the array
      numCounted(nameIndex) = counter //Stores the num in the index associated with the name

     }
    var largestValue = numCounted.max // Largest value in the array
    val numValues = numCounted.count(_ == largestValue) // Number of times the value appears
    var indeces : Set[Int] = Set()
    var completeList : TreeSet[(String, Int)] = TreeSet() // Completed list of all names / values

    if(numValues > 1){// Used JIC there are multiple instances of numValues
    for(i <- 0 until numCounted.length){ //If there are multiple instances, find the indeces of them
      if(numCounted(i) == largestValue)
        indeces(i)                       //add the index to the array
    }
    val wow = indeces.toList //Converts a mutable Set to an immutable list
     for(i <- 0 until wow.size){ //iterate through the indeces and associate with names
       completeList.map(crooksListed(wow(i)), wow(i)) //Maps the values to the completeList TreeSet
       //Supposed to solve problem with mismatched types

     } 
    }
    else{

      completeList.map(i => (crooksListed(numCounted.indexOf(largestValue)), largestValue)) //Maps the values to the TreeSet
    }
  }// end biggestCrook

println(biggestCrooks(a))

1 Ответ

0 голосов
/ 07 февраля 2020

Помните, что каждое выражение в scala является выражением , и каждое выражение имеет возвращаемый тип и должно что-то возвращать, В вашем примере первая ветвь оператора if else возвращает Ничего , в scala это означает Единица Тип:

if(numValues > 1){// Used JIC there are multiple instances of numValues
  for(i <- 0 until numCounted.length){ //If there are multiple instances, find the indeces of them
    if(numCounted(i) == largestValue)
      indeces(i)                       //add the index to the array
  }
  val wow = indeces.toList //Converts a mutable Set to an immutable list
  for(i <- 0 until wow.size){ //iterate through the indeces and associate with names
    completeList.map(crooksListed(wow(i)), wow(i)) //Maps the values to the completeList TreeSet
    //Supposed to solve problem with mismatched types

  }
// this for loop returns Unit, it just iterates on elements, and you need to add return value for compile
}
else{

  completeList.map(i => (crooksListed(numCounted.indexOf(largestValue)), largestValue)) //Maps the values to the TreeSet
// in this place you return mapped cimpleteList as Tree, but be carefull it's empty
}

Я думаю, что этот образец может быть что-то вроде this:

if (numValues > 1) { // Used JIC there are multiple instances of numValues
  for (i <- numCounted.indices) { //If there are multiple instances, find the indeces of them
    if (numCounted(i) == largestValue)
      indeces(i) //add the index to the array
  }
  indeces.map(w => crooksListed(w) -> w).foldLeft(TreeSet.empty[(String, Int)]){
    case (tree, pair) => tree + pair
  }
} else {
  completeList.map(i => (crooksListed(numCounted.indexOf(largestValue)), largestValue)) //Maps the values to the TreeSet
}

Здесь я заполняю пустое дерево в true ветви парами из crooksListed и wow Indedes, и эта ветвь возвращает TreeSet как false ветвь. Попробуйте прочитать больше о выражениях и попробуйте использовать recursion вместо для и , тогда как loop.

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