Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重载的方法调用有多种选择:String.format_String_Scala_Unicode_Stringbuilder - Fatal编程技术网

重载的方法调用有多种选择:String.format

重载的方法调用有多种选择:String.format,string,scala,unicode,stringbuilder,String,Scala,Unicode,Stringbuilder,我在下面编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到StringBuilder中,并将带转义unicode的格式化字符串返回给调用方进行其他处理 Scala编译器在有String.format调用的行中抱怨以下错误: 重载的方法值格式和可选项:(x$1;java.util.Locale;x$2:String,x$3:Object*)(x$1:String,x$2:Object*)字符串不能应用于(*String,Int) 类TestClass{ 私有def escape

我在下面编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到
StringBuilder
中,并将带转义unicode的格式化字符串返回给调用方进行其他处理

Scala编译器在有
String.format
调用的行中抱怨以下错误:

重载的方法值格式和可选项:
(x$1;java.util.Locale;x$2:String,x$3:Object*)
(x$1:String,x$2:Object*)
字符串不能应用于
(*String,Int)

类TestClass{
私有def escapeUnicodeStuff(输入:字符串):字符串={
//输入StringBuilder=scala.collection.mutable.StringBuilder
val sb=新的StringBuilder()
val cPtArray=toCodePointArray(input)//此方法调用返回一个数组[Int]
val len=cPtArray.length
用于(i 65535){
val hi=(cPtArray(i)-0x10000)/0x400+0xD800
val lo=(cPtArray(i)-0x10000)%0x400+0xDC00
sb.append(String.format(\\u%04x\\u%04x),hi,lo))/**在这里抱怨**
}else if(codePointArray(i)>127){
sb.append(String.format(“\\u%04x”,codePointArray(i))//**在这里抱怨**
}否则{
sb.append(String.format(“%c”,codePointArray(i))/**在这里抱怨**
}
}
使某人扭动
}
}


我如何解决这个问题?如何清理代码以实现格式化字符串的目的?提前感谢这里的Scala专家

我无法确定到底是什么导致了“过载冲突”,但请注意下面的代码:

scala> "\\u%04x\\u%04x".format(10,20)
res12: String = \u000a\u0014
使用works提供的方法。

Java中的方法期望
对象
作为其参数。Java中的
对象
类型相当于Scala中的
AnyRef
类型。Scala中的基元类型扩展了
AnyVal
——而不是
AnyRef
。阅读更多有关
AnyVal
AnyRef
Any
或中的区别的信息。最明显的修复方法是使用Java中的
整数
包装类来获取
对象
表示您的
整数

String.format("\\u%04x\\u%04x", new Integer(hi), new Integer(lo))
使用这些包装类几乎是unidiomatic Scala代码的象征,只有在没有更好的选择时,才应该用于与Java的互操作性。在Scala中,更自然的方法是使用等效的方法
format

"\\u%04x\\u%04x".format(hi, lo)
您还可以使用更简洁的语法:

f"\\u$hi%04x\\u$lo%04x"
此外,在Scala中,使用类似于此处的
for
循环是不规则的。最好使用函数列表方法之一,如
map
foldLeft
,甚至
foreach
以及使用
match
语法的部分函数。例如,您可以尝试以下操作:

toCodePointArray(input).foreach {
    case x if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        sb.append(f"\\u$hi%04x\\u$lo%04x") 
    case x if > 127 => sb.append(f"\\u$x%04x") 
    case x => sb.append(f"$x%c")    
}
或者,如果您不必使用
StringBuilder
,它实际上只需要在附加许多字符串的情况下使用,那么您可以用
foldLeft
替换整个方法体:

def escapeUnicodeStuff(input: String) = toCodePointArray(input).foldLeft("") {
    case (acc, x) if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        acc + f"\\u$hi%04x\\u$lo%04x"
    case (acc, x) if x > 127 => acc + f"\\u$x%04x"
    case (acc, x) => acc + f"$x%c"
}
或偶数
映射
,后跟
mkString

def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
    case x if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        f"\\u$hi%04x\\u$lo%04x"
    case x if x > 127 => f"\\u$x%04x"
    case x => f"$x%c"
}.mkString

您是指StringOps提供的方法吗?再次感谢您的编辑。这个问题看起来好多了。谢谢你花这么多时间和精力来回答。我喜欢你的解释非常清晰和翔实。我喜欢非常优雅的case方法。对于第二种解决方案,编译器说:类型不匹配:需要单元:StringI正确。你的代码非常完美。我只是看得不对。谢谢
def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
    case x if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        f"\\u$hi%04x\\u$lo%04x"
    case x if x > 127 => f"\\u$x%04x"
    case x => f"$x%c"
}.mkString