我正在寻找在数据结构中存储值的最佳方法,其中值来自查询三列xxxxxx GROUP BY状态,高度; (即两列)。结果看起来像。
status | height | count |
--------------------------
InUse | 90 | 5 |
InUSe | 80 | 3 |
stock | 80 | 1 |
stock | 120 | 3 |
scrap | 90 | 1 |
现在,我想以某种数据结构或MultiMap或任何最佳方式存储,以便获得计数值。
要么
不管我可以用此值操作的最佳方法。
我想到的一件事是,对于每组唯一的(状态,高度)->计数,我将获得计数的值,以及如何存储它们。
我可以做类似
Map< Map<someENUM, List<Long>>, Long>
的事情吗这对我有帮助吗?
或以其他方式存储和使用此值而不会造成混乱。
status of type ENUM
height of type Long
count of type Long
编辑:感谢您的答复@Andy Turner,@ OAD和@burhancerit
这些答案在Java中效果很好。但是对于我没有具体说明我所使用的上下文感到抱歉。
我正在使用的上下文是我要填充HTML表
jstl / EL中的@Andy Turner建议的番石榴表或@OAD和@ burhancerit建议的
ArrayList<myObject>
。像这样的东西
status | height | count | Height | stock | Scrap | InUSe
-------------------------- ---------------------------------
InUse | 90 | 5 | HTML 90 | 0 | 1 | 5
InUSe | 80 | 3 | ------> Table 80 | 1 | 0 | 3
stock | 80 | 1 | using EL 120 | 3 | 0 | 0
stock | 120 | 3 |
scrap | 90 | 1 |
因此,现在是在这种情况下以及如何在EL中使用它们的最佳方法。
最佳答案
由于标记了Guava:将其存储在Guava Table中,其中行是状态,列是高度:
Table<String, Long, Long> table;
例如:
// Construction:
ImmutableTable.Builder<String, Long, Long> builder =
ImmutableTable.builder();
for (RowType row : rows) {
builder.put(row.getStatus(), row.getHeight(), row.getCount());
}
ImmutableTable<StatusType, HeightType, CountType> table = builder.build();
// Retrieval:
Long count = table.get("InUse", 90L);
要构建您在问题中描述的表,可以使用此答案中建议的表结构,也可以转置该表,使其成为Table(交换行和列)。然后(示例作为普通的控制台输出给出,因为我不熟悉el):
Set<String> statuses = table.columnKeySet();
System.out.print("Height");
for (String status : statuses) {
System.out.print("|" + status);
}
System.out.println();
for (Long height : table.rowKeySet()) {
System.out.print(height);
for (String status : statuses) {
Long count = Objects.firstNotNull(table.get(height, status), 0L);
System.out.print("|" + count);
}
System.out.println();
}