2014-02-04 2 views
0

Что является наиболее эффективным способом, чтобы создать набор из строки, как этотКак создать набор из строки в Scala

val string = "Set(1,3,3,4,5)" 

val mySet = string.toSet[Int] 
res0: Set[Int] = Set(1,3,4,5) 

Я хочу, чтобы создать этот toSet метод.

+0

Значит ли эффективное среднее "мое время va luable "или" это работает на моих объектах с включенной поддержкой google, поэтому я не могу запустить компилятор, чтобы сделать это "? –

ответ

5
implicit class StringWithToIntSet(val self: String) extends AnyVal { 
    def toIntSet: Set[Int] = { 
    val Re = """Set\((.*)\)""".r 
    self match { 
     case Re(inner) => inner.split(",").map(_.toInt).toSet 
    } 
    } 
} 

Тогда:

scala> "Set(1,3,3,4,5)".toIntSet 
res0: Set[Int] = Set(1, 3, 4, 5) 

Примечание:

  • Вы не можете назвать его toSet потому String уже есть метод toSet (что создает Set[Char])
+1

Есть ли случаи, когда вы не использовали бы неявный для простого случая? Обычно я думаю об использовании имплицитов для случаев, когда их сложение по сложности и затенение местоположения метода более чем компенсируются упрощением многих точек использования. Это, напротив, выглядит компульсивным для меня - «кто-то с молотом». Тем не менее, вы, очевидно, сделали чертовски больше Scala, чем я! –

+0

Я согласен с тем, что 'toIntSet' не может быть хорошим кандидатом для неявного, поскольку он, вероятно, будет использоваться только в одном месте. Простой частный метод просто добавит 1 дополнительный символ: 'toIntSet (" Set (1,3,3,4,5) ")'. Для меня добавленная путаница того, откуда приходит метод, может быть слишком большой. Кроме того, я не думаю, что 'toIntSet' чувствует себя правильно на String, так как требует, чтобы String имел определенный контент. Это, однако, очень личное, я думаю. Замечание: реализация не сработает, если шаблон не соответствует. – EECOLOR

Смежные вопросы