文字列内の文字をシャッフルするにはどうすればよいですか (たとえば、hello は ehlol または lleoh または ...)。メソッドを使いたくないのですがCollections.shuffle(...)
、もっと簡単なものはありますか?
76292 次
16 に答える
34
私はもっと簡単なことを知りません。ただし、Math.rand() 機能を使用して、置換せずに文字の長さの範囲内で乱数を生成すると、シャッフルされた出力が得られます。
public class Shuffle {
public static void main(String[] args) {
Shuffle s = new Shuffle();
s.shuffle("hello");
}
public void shuffle(String input){
List<Character> characters = new ArrayList<Character>();
for(char c:input.toCharArray()){
characters.add(c);
}
StringBuilder output = new StringBuilder(input.length());
while(characters.size()!=0){
int randPicker = (int)(Math.random()*characters.size());
output.append(characters.remove(randPicker));
}
System.out.println(output.toString());
}
}
/*
Sample outputs
hlleo
llheo
leohl
lleho
*/
于 2010-07-23T08:55:06.460 に答える
12
素晴らしいパフォーマンスではありませんが、私の意見ではかなり読みやすいです:
public static String shuffleString(String string)
{
List<String> letters = Arrays.asList(string.split(""));
Collections.shuffle(letters);
String shuffled = "";
for (String letter : letters) {
shuffled += letter;
}
return shuffled;
}
于 2012-06-21T00:52:50.650 に答える
6
なんと厄介な問題でしょう。私は最終的にこれで終わった:
import java.util.Collections;
import com.google.common.primitives.Chars;
import org.apache.commons.lang3.StringUtils;
String shuffle(String s) {
List<Character> chars = Chars.asList(s.toCharArray());
Collections.shuffle(chars);
return StringUtils.join(chars.stream().toArray());
}
はい、2つのライブラリ:)
于 2016-09-03T22:17:15.633 に答える
3
例えば:
static String shuffle(String text){
if (text.length()<=1)
return text;
int split=text.length()/2;
String temp1=shuffle(text.substring(0,split));
String temp2=shuffle(text.substring(split));
if (Math.random() > 0.5)
return temp1 + temp2;
else
return temp2 + temp1;
}
于 2010-07-23T09:01:38.857 に答える
3
class ShuffleString
{
public static String shuffle(String s)
{
String shuffledString = "";
while (s.length() != 0)
{
int index = (int) Math.floor(Math.random() * s.length());
char c = s.charAt(index);
s = s.substring(0,index)+s.substring(index+1);
shuffledString += c;
}
return shuffledString;
}
}
public class foo{
static public void main(String[] args)
{
String test = "hallo";
test = ShuffleString.shuffle(test);
System.out.println(test);
}
}
出力: アロール
于 2010-07-23T09:09:17.717 に答える
2
学校用でない限り、シャッフルを使用したくない理由がわかりません。;)
また、パフォーマンスに関心がある場合は、文字列を「+」で連結するソリューションは絶対に使用できません。
私が思いつくことができる最もコンパクトなソリューションは次のとおりです。
public static String shuffle(String string) {
if (StringUtils.isBlank(string) {
return string;
}
final List<Character> randomChars = new ArrayList<>();
CollectionUtils.addAll(randomChars, ArrayUtils.toObject(string.toCharArray()));
Collections.shuffle(randomChars);
return StringUtils.join(randomChars, "");
}
于 2013-09-05T21:33:54.577 に答える
2
再帰も Collection への変換も必要としないコードを次に示します。
public static String shuffle(String string) {
StringBuilder sb = new StringBuilder(string.length());
double rnd;
for (char c: string.toCharArray()) {
rnd = Math.random();
if (rnd < 0.34)
sb.append(c);
else if (rnd < 0.67)
sb.insert(sb.length() / 2, c);
else
sb.insert(0, c);
}
return sb.toString();
}
于 2012-12-14T23:02:53.520 に答える
1
Kotlin では、次のことができます。
val helloCharArray = "hello".toCharArray()
helloCharArray.shuffle()
val shuffledHello = helloCharArray.concatToString()
于 2020-12-30T17:43:14.303 に答える
0
各文字を次の文字と比較して、すべての文字を反復処理できます。次に、Math.rand() > 0.5 の場合、この文字を次の文字と入れ替えます。そうでない場合は、次の文字に進みます。
于 2010-07-23T08:57:40.307 に答える
0
String shuffled;
do {
shuffled = Stream.of(text.split("")).sorted((o1, o2) -> ThreadLocalRandom.current().nextInt(3) - 1).collect(Collectors.joining());
}while(shuffled.equals(text));
于 2016-03-13T15:00:34.083 に答える
0
import org.apache.commons.lang3.ArrayUtils;
String shuffle(String text) {
char[] chars = text.toCharArray();
ArrayUtils.shuffle(chars);
return String.valueOf(chars);
}
于 2021-02-09T13:34:25.187 に答える
0
Java 8+ ではCollectors.shuffle(...)
、次のように 3 行でこれを行うことができます。
コード:
public static String shuffle(final String str) {
List<Character> chars = str.chars().mapToObj(e->(char)e).collect(Collectors.toList());
Collections.shuffle(chars);
return chars.stream().map(e->e.toString()).collect(Collectors.joining());
}
デモ:
于 2020-08-01T08:52:22.743 に答える