Scala:函数测试一个字符串表示唯一的char

时间:2014-04-03 09:55:22

标签: java scala

解决!解决方案在底部。

我将一些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

这里解释了代码的确切工作原理: How does this Java code which determines whether a String contains all unique characters work?

直接将它移植到Scala并不是真的有效,所以我正在寻找一种更有效的方法来重写上面的内容。

我试过BigInt&amp; BitSet

def isUniqueChars2(str : String) : Boolean =
// Java, char's 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
}

然而,这可行,但没有位移和没有小写假设。 表现很不为人知......

但是,我想做一个更实用的风格解决方案。

感谢user3189923的解决方案。

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

那就是它。谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

怎么样:

str.toSet.size == str.size