如何在不使用 Collections.shuffle(...) 的情况下打乱字符串中的字符?
如何打乱字符串中的字符(例如 hello 可以是 ehlol 或 lleoh 或...)。我不想使用 Collections.shuffle(...)
方法,有没有更简单的方法?
How do I shuffle the characters in a string (e.g. hello could be ehlol or lleoh or ...). I don't want to use the Collections.shuffle(...)
method, is there anything simpler?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
我不知道有什么更简单的事情。但是您可以使用 Math.rand() 功能在字符长度范围内生成一个随机数而无需替换,这将为您提供打乱的输出
I dont know anything simpler. But you can use the Math.rand() functionality to generate a random number within the range of the character's length without replace and that would give you a shuffled output
性能不是很好,但在我看来相当可读:
Not great performance, but quite readable in my opinion:
这个怎么样:
How about this:
多么烦人的问题啊。我最终得到了这个:
是的,两个库:)
What an annoying problem. I finally ended up with this:
Yes, two libraries :)
例如:
E.g.:
输出:
阿赫洛尔
Output:
ahlol
下面的代码既不需要递归,也不需要转换为集合。
Here's code that requires neither recursion, nor converting to a Collection.
不知道为什么你不想使用随机播放,除非是为了学校。 ;)
如果您关心性能,您绝对不能使用任何用“+”连接字符串的解决方案。
这是我能想到的最紧凑的解决方案:
Not sure why you wouldn't want to use shuffle, unless it's for school. ;)
And if you're concerned with performance, you definitely can't use any solution that concatenates strings with "+".
Here's the most compact solution I could come up with:
没有外部库,对于那些不介意使用 Collections.shuffle() 的人:
Without external libraries, for those who do not mind using
Collections.shuffle()
:在 Kotlin 中,您可以执行以下操作。
In Kotlin, you can do the following.
您可以迭代所有字符,将每个字符与下一个字符进行比较。那么如果 Math.rand() > 0.5 将此字符与下一个字符交换,否则移至下一个字符。
You could iterate over all the characters, comparing each one with the next. Then if Math.rand() > 0.5 swap this character with the next, otherwise move on to the next character.
如果仍想恢复原来的
String稍后,尝试这样的事情:
If you still want to restore the original
String
later on, try something like this:在 Java 8+ 中,可以使用
Collectors.shuffle(...)
在三行中完成此操作,如下所示:代码:
演示:
Rextester 演示
In Java 8+ this can be done using
Collectors.shuffle(...)
in three lines as follows:Code:
Demo:
Rextester demo
使用 commons-lang3:
Using commons-lang3:
使用 Stream API 的另一种简短实现:
One more short implementation using Stream API:
某些
String
可能包含由多个字符组成的符号。为了解决这个问题,您可以将
String
转换为代码点,对数组进行打乱,然后将它们转换回String
。可以像 this 或使用任何其他方法来完成数组的洗牌:
作为性能较差的替代方案,您可以使用包装对象并随机播放流:
Some
String
s may contain symbols consisting of multiple characters.In order to get around this, you can convert the
String
to code points, shuffle the array and convert them back to aString
.Shuffling the array could be done like this or using any other method:
As a less-performant alternative, you could use wrapper objects and shuffle the stream: