我需要找到一个合适的数据结构

时间:2012-09-27 14:10:36

标签: java algorithm

我不确定应该用什么数据结构来解决它, 我有一个类别列表和与它们关联的值列表如下:

Categories           Values 
Smart             **person1**,person2
Handsome          person3,person6,**person1**
Hard-Working      person7,person9

例如,person1是Smart and Handsome,因为他同时属于帅气和智能两类。 (值(人)可以在许多类别中)和person2是智能但不是英俊。

人物对象有名称,年龄和性别,例如人1是

John 43 Male

我想知道如何设计它,我在想一个二维数组,但这不是一个好主意,因为我会有一些空余的地方

Cat1 v3,v6 Spare Spare
Cat2 v10 Spare Spare Spare
cat4 v6,v7,v8,v9

我认为最好的是有一个列表,但不确定如何找出哪个类别或类别的值(如上面示例中与v1和cat4相关的V6)< / p>

 V3 v6 v7 v8 v9 v10

2 个答案:

答案 0 :(得分:3)

您可以使用类似

的内容

Map<Category, List<Person>>

由于Map应该提供O(1)访问权限,因此您希望您的密钥是您用来查找最多的密钥(在您的情况下,从我收集的内容中分类)。所以,如果你有

Map<Category, List<Person>> categoryLookup = new HashMap<Category, ArrayList<Person>>();

你可以做到

List<Person> values = myCategoryLookup.get(someCategory);

然后迭代值。对同一个值的引用可以在多个列表中 - 这不是问题。

对于下面的Yameo,如果你想获得一个人的类别,你可以

  1. Person维护其类别列表
  2. “反转”上面的数据结构;也保持Map<Person, List<Category>>
  3. 这些解决方案的替代方法是在CategoryPerson类中设置关系。例如,PersonList<Category>作为其类属性之一,同样CategoryList<Person>作为其类属性之一。但我觉得这更像是一个数据结构问题。如果您有一个包含实际数据的数据库并且将使用ORM工具将数据映射到Java类,那么您可能会这样做。

答案 1 :(得分:1)

在数据库中,您将使用junction table。另见many to many。根据您的需要,您可以使用enum作为类别,使用MultiMap<Person, Category>作为存储。