Java 番石榴:保持插入顺序的HashBasedTable?

Java 番石榴:保持插入顺序的HashBasedTable?,java,guava,Java,Guava,我需要一种方法来为一个值保留两个键——这正是Guavan的HashBasedTable所做的。问题是它在迭代值时没有保持插入顺序。有什么优雅的解决方案可以让它工作吗?它不一定是番石榴,但我不想让我的项目充满依赖性 我试图使用提到的ImmutableTable,但我还没有找到任何例子。当我建立这样一张桌子时,我到处都能得到NPE: ImmutableTable<String, String, AbstractUnit> units; ImmutableTable.Builder<

我需要一种方法来为一个值保留两个键——这正是Guavan的HashBasedTable所做的。问题是它在迭代值时没有保持插入顺序。有什么优雅的解决方案可以让它工作吗?它不一定是番石榴,但我不想让我的项目充满依赖性

我试图使用提到的ImmutableTable,但我还没有找到任何例子。当我建立这样一张桌子时,我到处都能得到NPE:

ImmutableTable<String, String, AbstractUnit> units;
ImmutableTable.Builder<String, String, AbstractUnit> builder =        units.builder();
builder.put(unit1.getType(), unit1.getName(), unit1);
...
units = builder.build();
不可变单位;
不可变的.Builder=units.Builder();
put(unit1.getType(),unit1.getName(),unit1);
...
units=builder.build();

我将在获取b units.values()时获取NPE。此外,我是否能够修改表中AbstractUnit的值?

不可变
将保持插入顺序,就像所有其他不可变集合一样。

您可以为表指定后端映射结构。指定LinkedHashMap将保持插入顺序

 Table<String,String,AbstractUnit> units = Tables.newCustomTable(new LinkedHashMap<>(), LinkedHashMap::new); 
Table units=Tables.newCustomTable(新LinkedHashMap(),LinkedHashMap::new);
我试着使用@Louis Wasserman所描述的ImmutableMap,它改为自然排序。

自Guava 20.0以来,保持插入顺序。具体而言:

使用链接哈希表实现表。这保证了各种视图的可预测迭代顺序


从内部看,它有一个。

是相关的,看起来很有趣,但我找不到任何使用示例。我只会将项目放入表中一次,每次我想访问任何内容时是否必须在表上调用.build()?不,那太傻了。只需使用
不可变的.Builder
创建表,在向表中添加项目后调用
build()
,然后将生成的
不可变的
存储在任何地方。我对正确使用它有一些疑问,而且我还没有找到任何示例。当我构建这样一个表时,到处都是NPE:不可变的单位;不可变的.Builder=units.Builder();builder.put(unit1.getType(),unit1.getName(),unit1)。。。units=builder.build();我将在获取b units.values()时获取NPE。另外,我是否能够修改表中AbstractUnit的值?我有一组单元测试,当我更改为Immutable时,这些测试开始失败。我有一个用户,它拥有执行操作的所有数据和服务。我在服务中初始化表并在那里设置值[Service has Table=user.getUnits()]。它拥有所有的数据,但在某一点上表的值变为空。可能缺少什么?如果
变为null,那么您必须在某个地方将其设置为null——没有其他可能性。尝试将表格变量标记为
final
,以使其无法更改。