Java 我将使用什么数据结构根据字母频率和位置对单词进行排序?
我有一个项目,我正在工作,我计划在java和ActionScript中实现,这就是为什么我标记了这两种语言 为了完成这个项目,我需要从给定的字典中创建一组具有给定长度的所有单词。然后,在选择一个字母后,我需要根据字母的位置和频率创建单词子集。例如,如果集合包含Java 我将使用什么数据结构根据字母频率和位置对单词进行排序?,java,actionscript-3,Java,Actionscript 3,我有一个项目,我正在工作,我计划在java和ActionScript中实现,这就是为什么我标记了这两种语言 为了完成这个项目,我需要从给定的字典中创建一组具有给定长度的所有单词。然后,在选择一个字母后,我需要根据字母的位置和频率创建单词子集。例如,如果集合包含 {this, time, pate, malt, that, teat, tote} 用户选择字母“t”,我需要将集合划分为子集,以便: Subset 1 (t___) = {this, time} Subset 2 (__t_) =
{this, time, pate, malt, that, teat, tote}
用户选择字母“t”,我需要将集合划分为子集,以便:
Subset 1 (t___) = {this, time}
Subset 2 (__t_) = {pate}
Subset 3 (___t) = {malt}
Subset 4 (t__t) = {that, teat}
Subset 5 (t_t_) = {tote}
对于存在的每个子集(请注意(_t___)不存在,因此未创建任何子集)
在这种情况下,什么样的数据结构是我的最佳选择?我正在为java和ActionScript编写这个程序,所以理想情况下,它将是一个我可以同时用于这两个程序的结构。然而,如果必要的话,我不会完全改变语言之间的数据结构。这两个程序将是我自己实践中的独立实现;不需要跨平台功能
我考虑过一些事情:
尝试:通常当我处理一组单词时,我使用带有Trie的节点。然而,我认为这在本例中不起作用,因为没有有效/优雅的方法根据字母的位置将Trie拆分为单词。例如,对于在第三个位置有特定字母而不在任何其他位置的任何事物,转换trie都是非常低效的。所以我认为尝试是行不通的
数组:最基本的数据结构。简单易用。我可能可以将单词集存储为字符串数组,然后使用charAt()对字符串进行一系列比较,将它们拆分为子集。然而,这似乎也不是很优雅,我想会有一个更好的结构使用
ArrayList:与数组类似的问题。我不确定列表实现是否有任何帮助
字典/地图:它们的唯一优点是我以前用过它们。我真的认为它们根本不适合这种情况
现在,您只需要迭代列表:1并填充第二个映射 以下是我使用的数据结构 首先,我使用一些HashSet来存储每一组单词。设置使您不必担心列表中的重复单词会减少每个列表中的单词数 其次,我使用HashMap>映射键/值对 第三,键是通过将每个单词的字符数组中的每个字母与猜测的字母进行比较而动态创建的字符串。如果字符是匹配的,我会加上“1”,否则加上“0”。这给我留下了一个由1和0组成的适当长度的键,显示每个字符的数量和位置 为了对单词进行排序,我为每个单词创建了这个关键字。然后,如果该键已经存在于映射中,我将其添加到映射到该键的HashSet中。否则,我用包含新词的新哈希集创建了一个新的键值对
这对我的测试样本量非常有效。在我完成剩下的代码后,我仍然需要为60000多个单词的字典运行它,并确保它可以扩展,但当我只处理几百个单词时,它工作得非常快。到目前为止,您自己的分析是什么?您的候选人有哪些优点和缺点?所以我们将在
集合中确定字母的位置或单词的长度?i、 我们将有什么样的投入?用我的首字母更新了OPanalysis@Looser当前位置我们将知道单词的长度。初始集合中的所有单词长度相同(它们实际上是根据长度从字典中提取的)。输入将是我们要匹配的字符;我们将根据角色的数量/角色所处的位置划分为多个集合。到目前为止,我倾向于用一段时间来处理单词列表。这比ArrayList好,因为对于集合,我不必担心重复。如何使用子集作为键?对于以字母开头的单词,是否需要一系列布尔值来跟踪其位置ie 1000?或者我必须动态创建一个正则表达式来对它们进行排序?