0

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

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

例如,person1 是 Smart 和 Handsome,因为他同时属于 Handsome 和 Smart 类别。(一个值(人)可以有很多类别)并且 person2 是 Smart 但不是 Handsome。

人对象具有姓名、年龄和性别,例如人 1 是

John 43 Male

我想知道如何设计它,我在考虑一个二维阵列,但这不是一个好主意,因为我会有一些空闲的地方

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

我想最好是有一个列表,但不确定如何找出哪个值是哪个或哪个类别的(例如上面示例中与 cat1 和 cat4 相关联的 V6)

 V3 v6 v7 v8 v9 v10
4

2 回答 2

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>>

这些解决方案的替代方法是在CategoryPerson类本身中设置关系。例如,Person将 aList<Category>作为其类属性之一,并且类似地Category将 aList<Person>作为其类属性之一。但我觉得这更像是一个数据结构问题。如果您有一个包含实际数据的数据库并且打算使用 ORM 工具将数据映射到 Java 类,那么您可能会这样做。

于 2012-09-27T14:12:29.177 回答
1

在数据库中,您将使用联结表。另请参见多对多。根据您的需要,您可以将enuma 用于类别,将 aMultiMap<Person, Category>用于存储。

于 2012-09-27T14:20:35.697 回答