Как я могу проверить, встречается ли персонаж дважды - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу проверить, встречается ли какой-либо символ ровно 2 раза, и встречается ли какой-либо символ ровно 3 раза.Почему-то я не могу заставить его работать.

  val pattern1 = "(.)\\1{1}"
  val pattern2 = "(.)\\1{2}"
  private def checkLine(line: String): (Int, Int) = {
    if(line.matches(pattern1) && line.matches(pattern2)) (1, 1)
    else if(line.matches(pattern2)) (0, 1)
    else if(line.matches(pattern1)) (1, 0)
    else (0, 0)
  }

Возвращает всегда (0, 0)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вот два регулярных выражения, которые соответствуют, только если есть хотя бы символ, встречающийся ровно только дважды,

^(?=.*(.).*\1)(?!(.*\1){3}).*$

Демонстрация для ровно 2 символов, повторяющихся

И это для персонажа, точно в точности повторяющего трижды.

^(?=.*(.)(?:.*\1){2})(?!(.*\1){4}).*$

Демонстрация для точно повторяющихся 3 символов

0 голосов
/ 04 декабря 2018

Я сделал для вас другое решение, которое не будет использовать регулярное выражение:

val str: String = "Hello World!"

// Split the String into Strings containing single chars
val arr: Array[String] = str.split("")

// Group the characters into Arrays
val grouped: Array[Array[String]] = arr.groupBy[String](identity[String])
  .values
  .toArray

// Extract the count of the inner Array
val counted: Array[Int] = grouped.map(_.size)

// Create a tuple containing the information if 2 or 3 values have been found
val tuple: (Boolean, Boolean) = (counted.contains(2), counted.contains(3))

// Transform it into the required representation (true => 1, false => 0)
val tuple2: (Int, Int) = (if(tuple._1) 1 else 1, if(tuple._2) 1 else 0)

println(tuple2)

Результат:

(1, 1)

Попробуйте!


Некоторая информация о том, что делает arr.groupBy[String](identity[String]):

groupBy допускает преобразование до группировки.В большинстве случаев это необходимо, но не в этом случае.Здесь мы хотим сгруппировать строки, которые равны.Поскольку мы не хотим преобразовывать значения, мы вместо этого используем identity[T] (это более красивый способ записи a => a).


Надеюсь, это поможет.

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