3

我有一个TreeBasedTable来自 Guava (Gooogle Collections) 的对象。它的形式是TreeBasedTable<k1, k2, v>k1k2实施Comparable。现在,当我显示表格时,我希望用户能够以不同的方式对其进行排序以更改值的顺序。

我尝试的方法是遍历表,并为每个值更改比较方法中使用的变量。问题是它通过循环一次,然后返回 a NullPointerException,我认为我已经缩小到尝试在迭代它时更改顺序(我知道新手错误)。

所以我想知道,重新排序这张桌子的好方法是什么?

4

3 回答 3

3

您应该重新创建 TreeBasedTable 并向其提供另一个比较器。请参阅番石榴文档。另请注意,这在内部使用必须使用适当的比较器排序的树(当您构建树时,比较器是已知的,因此树是以特定方式构建的)。提供其他比较器将导致构建新树。如果这不是您想要的行为,您应该考虑使用其他数据结构。

于 2011-08-09T19:24:13.730 回答
3

如果您只是创建一个新的 TreeBasedTable,使用不同的比较器对象创建,然后通过公共 putAll 方法将原始数据复制到其中,怎么样?每个元素的 put 将占用 log(N),因此总时间应该是 N log(n),这大约是我期望重新排序花费的时间。

于 2011-08-09T19:24:38.333 回答
0

通过TreeBasedTable.create(TreeBasedTable<R, C, ? extends V>)切换他的一个标志来修改比较器后,用于从前一个创建一个新的

于 2011-08-09T19:27:50.717 回答