如何从整数序列构造String实例?

时间:2015-12-11 21:37:20

标签: string unicode smalltalk pharo squeak

我想从Unicode代码点

创建一个测试字符串

像这样的东西

    count=1;
    do{

            System.out.println("Please enter passenger " + count +" details:");
            passengerName=keyboard.nextLine();
            count++;
        keyboard.nextLine();    
    passengerInfo +="\nPassenger "+count+": "+passengerName;

    //ticket printout section
    System.out.println("Ticket");
    System.out.println("======");
    System.out.println("Number of Passengers: "+numOfPassengers);
    System.out.println(passengerInfo);
   }while (count<=numOfPassengers);
   }       
}

或者

 65 asCharacter asString,
 66 asCharacter asString,
 67 asCharacter asString,
 65 asCharacter asString,
769 asCharacter asString

这可行,但

我正在寻找一种将整数值数组转换为类String实例的方法。

String with: 65 asCharacter
       with: 66 asCharacter
       with: 67 asCharacter
       with: 65 asCharacter
       with: 769 asCharacter

这是否有内置方法? 我正在寻找像enter image description here这样的答案,但是对于字符串。

4 个答案:

答案 0 :(得分:8)

很多方式

<强> 1。 #streamContents:

如果您正在执行更大的字符串连接/构建,请使用流,因为它更快。如果只是串联几个字符串就会使用更易读的东西。

String streamContents: [ :aStream |
    #(65 66 67 65 769) do: [ :each |
        aStream nextPut: each asCharacter
    ]
]

String streamContents: [ :aStream |
    aStream nextPutAll: (#(65 66 67 65 769) collect: #asCharacter)
]

<强> 2。 #withAll:

String withAll: (#(65 66 67 65 769) collect: #asCharacter)

第3。 #collect:as:String

#(65 66 67 65 769) collect: #asCharacter as: String

<强> 4。 #joinUsing:字符

(#(65 66 67 65 769) collect: #asCharacter) joinUsing: ''
  

注意:

至少在Pharo中,您可以使用[ :each | each selector ],也可以只使用#selector。我发现后者对于简单的事情更具可读性,但这可能是个人偏好。

答案 1 :(得分:4)

使用#withAll:

构造String实例
String withAll: 
   (#(65 66 67 65 769) collect: [:codepoint | codepoint asCharacter])

答案 2 :(得分:1)

这是一个“低级”变体:

codepoints := #(65 66 67 65 769).

string := WideString new: codepoints size.
codepoints withIndexDo: [:cp :i | string wordAt: i put: cp].
^string

答案 3 :(得分:1)

请将以下内容视为非常黑客,无证,不受支持,因而绝对错误的方法!
你会认为你不能轻易混合字符和整数,你可以这样做:

'' asWideString copyReplaceFrom: 1 to: 0 with: (#(65 66 67 65 769) as: WordArray).

实际上,这是通过一个并不真正检查类的原语,而只是因为接收器和参数都是VariableWord类...

出于同样的原因(取决于WriteStream实现 - 让我们说脆弱),这可以起作用:

^'' asWideString writeStream
    nextPutAll: (#(65 66 67 65 769) as: WordArray);
    contents

同样适用于ByteString和ByteArray。

当然,同样地,让我们不要忘记最复杂的方式,BitBlt:

^((BitBlt toForm: (Form new hackBits: (WideString new: 5)))
    sourceForm: (Form new hackBits: (#(65 66 67 65 769) as: WordArray));
    combinationRule: Form over;
    copyBits;
    destForm) bits

我们再次利用WideString的WordArray性质作为Form(位图)位的容器。

希望这个答案不会获得太多选票,但它不配得到它!