19

文字列内の文字をシャッフルするにはどうすればよいですか (たとえば、hello は ehlol または lleoh または ...)。メソッドを使いたくないのですがCollections.shuffle(...)、もっと簡単なものはありますか?

4

16 に答える 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

commons-lang3 の使用:

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 行でこれを行うことができます。

  1. 文字列を文字のリストに変換する
  2. リストをシャッフルする
  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 に答える