从字符串中为字符分配随机整数

时间:2015-08-05 02:35:29

标签: java arrays string random character

所以我试图在 java 中制作一个anagram工具,在其中插入一个单词/字符串,并为该单词吐出一个字谜。可能比我要展示的更容易或更好的方法,但我仍然很好奇。这就是我想要做的事情:

让我们说这句话是:苹果

我想要做的是从该字符串中为每个字符分配一个randomInt(100)。我们举个例子来说就是

a - 35,p - 54,p - 98,l - 75,e - 13

之后,我希望我的程序将数字从最小到最大排序,然后打印带有数字指定字符的“新”字符串,最小到最大。在我的例子中,anagram将是: eaplp

所有的说法和完成,我被困在的地方是如何从字符串数组中实际分配一个字符随机数,而不是实际将该字符更改为该数字,然后将该新修改后的字符串打印出来我说的最好的方式。伪代码或真实代码会很棒。

由于

2 个答案:

答案 0 :(得分:6)

使用TreeMap<Integer, Character>。基本思路如下:

TreeMap<Integer, Character> myMap = new TreeMap<Integer, Character>();
for (int i = 0; i < myString.length(); i++) {
  myMap.put((int)(Math.random() * 100), myString.charAt(i));
}

for (Map.Entry<Integer, Character> entry : myMap.entrySet()) {
  System.out.print(entry.getValue());
}
System.out.println();

TreeMap按键自动对条目进行排序;因此,您不必单独进行排序。

然而,更简单的编码字符串的方法是将字符串转换为字符列表,然后使用Collections.shuffle()。基本理念:

List<Character> myLst = new ArrayList<Character>(myString.toCharArray());
Collections.shuffle(myLst);
for (Character c : myLst)
  System.out.print(c);
System.out.println();

上面可能有一些编译错误;我没有检查就写了它,但这个过程应该有效。

答案 1 :(得分:2)

如果您使用的是Java 8,那么直接的解决方案就是一个混乱的索引列表:

String word = "apple";
List<Integer> indices = IntStream.range(0, word.length()).collect(Collections.toList());
Collections.shuffle(indices);
indices.stream().mapToObj(word::charAt).forEach(System.out::print);

这可以通过中间人Map完成,但有点尴尬,更难以遵循:

Random random = new Random();
Map<Integer, Char> map = new TreeMap<>();
IntStream.range(0, word.length()).forEach(c -> map.put(random.nextInt(), c));
map.entrySet().stream().map(Map.Entry::getValue).forEach(System.out::print);

或者你可以把它全部放在一个(难以阅读)的流操作中:

word.chars().boxed().collect(Collectors.toMap(random::nextInt, Function.identity()))
    .entrySet().stream().sorted(Map.Entry.comparingByKey())
    .map(e -> Character.toChars(e.getValue()))
    .forEach(System.out::print);