首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机生成字符串中的字符

随机生成字符串中的字符
EN

Stack Overflow用户
提问于 2010-08-23 12:57:21
回答 2查看 2.9K关注 0票数 3

我需要在一个字符串java生成随机字符时,用户点击按钮。例如:如果以cat为例,我需要显示字符串中的字符,如下所示:

CAT、ACT、TAC、TCA

提前感谢

阿斯旺

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-23 14:29:32

嗨,谢谢大家,我终于找到了我的问题的解决方案。

代码语言:javascript
运行
复制
public String RandomString(String word){

    int no=word.length();
    String temp="";
    String temp2=null;
     while(no>0){
         int genNo=ran.nextInt(word.length());
         if(temp2==null){
             temp2=""+genNo;
             temp=Character.toString(word.charAt(genNo));
             no--;
         }else{
            if(!temp2.contains(""+genNo)){
                temp2=temp2+""+genNo;
                temp=temp+Character.toString(word.charAt(genNo));
                no--;
            }
         }
     }

    if(!temp.equals(word)){
         Log.v("check","temp2 = "+temp2);
         Log.v("check","String = "+temp);
        return temp;
    }else{
        RandomGenerate(word);
    }
    return null;

}
票数 1
EN

Stack Overflow用户

发布于 2010-08-24 03:29:22

关于Fisher-Yates混洗算法

Fisher-Yates shuffle是用于混洗的标准算法。下面是伪代码:

代码语言:javascript
运行
复制
To shuffle an array a of n elements:
   for i from n - 1 downto 0 do
         j ← random integer with 0 ≤ j ≤ i
         exchange a[j] and a[i]

下面是一个简单的Java实现:

代码语言:javascript
运行
复制
static String shuffled(String s) {
    char[] a = s.toCharArray();
    final int N = a.length;
    Random r = new Random();
    for (int i = N - 1; i >= 0; i--) {
        int j = r.nextInt(i + 1);
        swap(a, i, j);
    }
    return new String(a);
}
static void swap(char[] a, int i, int j) {
    char t = a[i];
    a[i] = a[j];
    a[j] = t;
}

然后你可以拥有:

代码语言:javascript
运行
复制
    String text = "stackoverflow";
    for (int i = 0; i < 10; i++) {
        System.out.println(shuffled(text));
    }

这将生成字符串"stackoverflow" (see also on ideone.com)的10次混洗。

Guava + Java集合框架替代解决方案

如果您安装了Guava library,那么这将是一个很好的解决方案。以下是关键事实:

  • Guava有Chars.asList(char...),它可以创建char[]List<Character>实时视图。对返回列表的修改将影响后备数组(反之亦然,versa).
  • java.util.Collections可以shuffle(List)

然后,我们可以将两者结合起来,以获得以下干净和可读的代码:

代码语言:javascript
运行
复制
import com.google.common.primitives.*;
import java.util.*;

public class AnagramCreator {
    public static void main(String[] args) {
        String text = "stackoverflow";
        char[] arr = text.toCharArray();
        List<Character> list = Chars.asList(arr);

        for (int i = 0; i < 10; i++) {
            Collections.shuffle(list);
            System.out.println(new String(arr));
        }
    }
}

上面的代码将打印"stackoverflow"的10个字形。

请注意,Guava仅用于提供char[]List<Character>实时视图。char[]不会自动装箱为Character[] (反之亦然),否则Arrays.asList(T...)就足够了。

另请参阅

  • Java Language Guide/Autoboxing

相关问题

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3544847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档