我最近问了这个问题,答案使我加深了理解,但他们并没有解决我遇到的实际问题。因此,我将尝试如下提出类似但不同的问题。
假设我要访问的随机rune
元素string
。一种方法是:
func RuneElement(str string, idx int) rune {
var ret rune
for i, c := range str {
if i == idx {
return c
}
}
return ret // out of range -> proper handling is needed
}
如果我想多次调用该函数怎么办?我猜我在寻找什么,就像是一个运算符/函数str[i]
(返回byte
),该函数将rune
元素放在i
第-th个位置。为什么可以使用for ... range
但不能通过str.At(i)
例如这样的功能来访问此元素?
string
Go中的值存储文本的UTF-8编码字节序列。这是已经做出的设计决定,不会改变。
如果要有效地rune
从任意索引处获取a ,则必须对字节进行解码,对此您将无能为力(for ... range
此解码将完成)。没有“捷径”。所选的表示形式并不提供此功能。
如果你必须这样做频繁/多少次,你应该改变你的输入,而不是使用string
,但一个[]rune
,因为它是一个切片,可以有效的索引。string
在Go中不是[]rune
。string
在Go中实际上是只读[]byte
(UTF-8)。期。
如果您无法更改输入类型,则可以构建一个内部缓存,string
将其映射为[]rune
:
var cache = map[string][]rune{}
func RuneAt(s string, idx int) rune {
rs := cache[s]
if rs == nil {
rs = []rune(s)
cache[s] = []rune(s)
}
if idx >= len(rs) {
return 0
}
return rs[idx]
}
这取决于情况是否值得:如果RuneAt()
使用一小套string
s进行调用,则可以大大提高性能。如果传递的字符串或多或少是唯一的,这将导致性能下降和大量内存使用。同样,此实现对于同时使用也不安全。
问题内容: 如何将字符串中的字符随机播放(例如,hello可能是ehlol或lleoh或…)。我不想使用该方法,有没有更简单的方法? 问题答案: 我不知道更简单。但是您可以使用Math.rand()功能生成字符长度范围内的随机数,而无需替换,这将给您带来混乱的输出
有没有办法从数组中选择一个随机字符串,而不再选择该字符串。所有字符串只拾取一次后,程序结束。 这是我当前的系统,publicstaticvoidmain(String[]argv){ 我的问题是,控制台将返回“此人已被选中”等等。并不是说节目结束系统不起作用,因为Rest会过早地起作用。 [1]: https://i.stack.imgur.com/54Eef.png [如您所见,程序结束,尽管没
问题内容: 我需要在检查的同时将以下更改为- ,以改善圈复杂度。 但是我不确定我将获得什么价值。 问题答案: Java(版本7之前的版本)在switch / case中不支持String。但是您可以通过使用枚举来达到预期的结果。
为什么它抛出一个错误?任何帮助都将不胜感激 编辑:
问题内容: 如何在不先进行大小检查(内联是可以接受的)或冒冒号危险的情况下,获取Java中字符串的第一个字符? 问题答案: 这是一个整洁的解决方案: 意见:虽然此解决方案“精巧”,但我认为它实际上比使用/ 以明显方式使用/ 的解决方案 可读性 差。如果读者没有看到此技巧,则他/她必须 更加努力 地理解代码。IMO,代码的含义在/ 版本中更加明显。有关更清洁/更易读的解决方案,请参见@paxdiab
问题内容: 我在何时遇到oracle的问题。 该查询始终返回null,尽管很明显结果应该是第一种情况。我是否缺少有关oracle中字符串比较的内容? 问题答案: 您要再次检查字符串和一个空字符串,从而出现问题;在Oracle中,您最好检查一下您的字符串: 关于Oracle处理空字符串和空值的方式,在这里您可以找到更多信息 一个例子: 给出: 简而言之,谈论时,您可以依靠的唯一支票是: