Scala: функция проверки строки на уникальный символ

1

Решено! Решение внизу.

Я переношу некоторый Java-код на Scala для удовольствия, и я попал в довольно изящный способ смещения бит в Java. В приведенном ниже коде Java вводится строка String и выполняется тестирование, если она состоит из уникальных символов.

public static boolean isUniqueChars(String str) {
if (str.length() > 256)return false; }
int checker = 0;
 for (int i = 0; i < str.length(); i++) {
    int val = str.charAt(i) - 'a';
  if ((checker & (1 << val)) > 0) return false;
 checker |= (1 << val);
 }
return true;

Полный список здесь: https://github.com/marvin-hansen/ctci/blob/master/java/Chapter%201/Question1_1/Question.java

Как точно работает код, здесь объясняется: как этот Java-код определяет, содержит ли String все уникальные символы?

Портирование этого непосредственно на Scala на самом деле не работает, поэтому я ищу более функциональный способ переписать вышеизложенное.

Я пробовал BigInt & BitSet

def isUniqueChars2(str : String) : Boolean =
// Java, char are Unicode so there are 32768 values
if (str.length() > 32768)  false
val checker = BigInt(1)
 for(i <- 0 to str.length){
   val value = str.charAt(i)
   if(checker.testBit(value)) false
   checker.setBit(value)
 }
true
}

Это работает, однако, но без битового смещения и без предположения о нижнем регистре. Производительность довольно неизвестна....

Тем не менее, я хотел бы сделать более функциональное решение.

Спасибо пользователю3189923 за решение.

 def isUniqueChars(str : String) = str.distinct == str

Это. Спасибо.

Теги:

2 ответа

2
Лучший ответ
str.distinct == str

В общем случае метод distinct сохранение порядка появления после удаления дубликатов. Рассматривать

implicit class RichUnique(val str: String) extends AnyVal {
  def isUniqueChars() = str.distinct == str
}

и так

"abc".isUniqueChars
res: Boolean = true

"abcc".isUniqueChars
res: Boolean = false
  • 0
    собирался спросить. Спасибо за хорошую идею, я не осознавал
1

Как насчет:

str.toSet.size == str.size

?

  • 0
    такая грубая сила

Ещё вопросы

Сообщество Overcoder
Наверх
Меню