在Java中基于字母频率创建字符数组的排列

在Java中基于字母频率创建字符数组的排列,java,arrays,cryptanalysis,Java,Arrays,Cryptanalysis,我有一个HashMap,它以字符、整数的形式存储密文块中每个字母的频率。然后,通过最频繁的降序将映射排序为LinkedHashMap 然后,我将这些频率与已知的字母频率列表进行比较,以尝试猜测密码字母是什么。我遇到的问题是,如果两个或多个字母出现的次数相同 例如,如果我们采取以下措施: E T A O I 密码文本中最常见的5个字母是desc,然后是字母频率: D=30 B=25 I=22 G=19 H=17 然后可以公平地假设D映射到E,因为它是最常见的,其次是B映射到T等等 如果字母频率

我有一个
HashMap
,它以字符、整数的形式存储密文块中每个字母的频率。然后,通过最频繁的降序将映射排序为
LinkedHashMap

然后,我将这些频率与已知的字母频率列表进行比较,以尝试猜测密码字母是什么。我遇到的问题是,如果两个或多个字母出现的次数相同

例如,如果我们采取以下措施:

E T A O I
密码文本中最常见的5个字母是desc,然后是字母频率:

D=30 B=25 I=22 G=19 H=17
然后可以公平地假设
D
映射到
E
,因为它是最常见的,其次是
B
映射到
T
等等

如果字母频率为:

D=30 B=25 I=22 G=22 H=22
目前尚不清楚
I
G
H
是否应该映射到
A
,因为它们都是仅次于
B
的最常见的

我有点卡住了,需要一种方法,用频率列表的每个排列创建一组字符数组。需要在字符数组中输出类似的内容:

DBIGH
DBIHG
DBGIH
DBGHI
DBHIG
DBHGI

非常感谢您的帮助

正如您所说,您需要创建字符串的每个排列
IGH
(这里可以同义使用字符串和字符数组)。显示了该问题的解决方案

要在地图中找到需要创建排列的部分,只需按频率顺序在地图上迭代,并跟踪相同频率的第一次出现

编辑:添加另一个想法以帮助您发表评论。
基本上,您可以将26个字符的字符串分成频率相同的组。在上面的例子中,这将是三组:
D
B
IGH
。要创建整个字符串的所有组合,需要将每个组的所有排列与所有其他组的所有排列组合在一起。对于不重要的ofc的单字符组。但一旦你有了更多的3+字符组,它就会变成一个长长的列表…

如果有多组重复怎么办?全键长26个字母,通常包含3组不同的字符reptition@JoshRoberts在上面的答案中添加了更多信息。