所以我试图在 java 中制作一个anagram工具,在其中插入一个单词/字符串,并为该单词吐出一个字谜。可能比我要展示的更容易或更好的方法,但我仍然很好奇。这就是我想要做的事情:
让我们说这句话是:苹果
我想要做的是从该字符串中为每个字符分配一个randomInt(100)。我们举个例子来说就是
a - 35,p - 54,p - 98,l - 75,e - 13
之后,我希望我的程序将数字从最小到最大排序,然后打印带有数字指定字符的“新”字符串,最小到最大。在我的例子中,anagram将是: eaplp
所有的说法和完成,我被困在的地方是如何从字符串数组中实际分配一个字符随机数,而不是实际将该字符更改为该数字,然后将该新修改后的字符串打印出来我说的最好的方式。伪代码或真实代码会很棒。
由于
答案 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);