检查网格Java中是否存在行的最有效方法

时间:2011-10-18 12:43:55

标签: java grid contains

所有

我想知道检查List< Set< Foo>>中是否已存在行的最有效方法是什么。 Foo对象具有键/值对(以及不适用于此问题的其他字段)。列表中的每个集都是唯一的。

举个例子:

List[
 Set<Foo>[Foo_Key:A, Foo_Value:1][Foo_Key:B, Foo_Value:3][Foo_Key:C, Foo_Value:4]
 Set<Foo>[Foo_Key:A, Foo_Value:1][Foo_Key:B, Foo_Value:2][Foo_Key:C, Foo_Value:4]
 Set<Foo>[Foo_Key:A, Foo_Value:1][Foo_Key:B, Foo_Value:3][Foo_Key:C, Foo_Value:3]
]

我希望能够检查列表中是否存在新的Set(例如:[Foo_Key:A,Foo_Value:1] [Foo_Key:B,Foo_Value:3] [Foo_Key:C,Foo_Value:4])

每个Set可以包含1-20个Foo对象。列表可以包含1-100,000个集合。 Foo不保证每个Set中的顺序相同(所以它们必须以某种方式预先排序以获得正确的顺序,如TreeSet)

想法1:把它变成矩阵会更有意义吗?每列都是Foo_Key,每行包含一个Foo_Value? 例如:

A B C
-----
1 3 4
1 2 4
1 3 3

然后查找包含新值的行?

创意2:创建每个Set的哈希值然后将其与新Set的哈希值进行比较会更有意义吗?

我有没有想到更有效的方式?

由于

2 个答案:

答案 0 :(得分:2)

如果您对TreeSets使用Sets,那么list.contains(set)只能执行TreeSet,因为equals会处理{{1}}检查吗?

另外,请考虑使用Guava的MultSet类。Multiset

答案 1 :(得分:0)

我建议你使用一个不太奇怪的数据结构。至于查找内容:通常哈希或排序+二进制搜索或树是可行的方法,具体取决于您期望的插入/删除量。阅读一本关于基本数据结构和算法的书,而不是试图重新发明轮子。

最后:如果这不是一个纯粹的学术问题,请遍历列表,并进行比较。最有可能的是,这是可以接受的快速。即使是100'000个条目也只需要几分之一秒,因此99%的用例无关紧要。

我想引用Knuth:过早优化是所有邪恶的根源。