我检查了一些相关的问题,但没有回答我的问题。我试图排序Map升序字母,但我有问题。以下是目前的代码:
// provinceName is key
public Map<String, String> regionMap() {
return
em
.createQuery(
"""
SELECT DISTINCT p.provinceName AS prov_id ,p.provinceAbbreviation AS prov_value
FROM CanadianPersonalIncomeTaxRate p
ORDER BY p.provinceName ASC
""",
Tuple.class
)
.getResultStream()
// .filter(prov_value -> prov_value.get())
// .sorted(Comparator.comparing(prov_value -> prov_value))
.collect(
Collectors.toMap(
tuple -> tuple.get(0, String.class),
tuple -> tuple.get(1, String.class)
)
);
}
我正在考虑使用.sorted或TreeMap,但我愿意接受如何最干净/简单地做它的建议。任何帮助都非常感谢。
2条答案
按热度按时间zujrkrfu1#
TreeMap和LinkedHashMap是满足上述需求的良好候选对象。
TreeMap是一个Map实现,它按排序顺序维护键。
示例来维护插入顺序。
vbopmzt12#
通过
TreeMap :: new
更改结果的声明以指示您希望Map按键排序。使用
NavigableMap
。这一点:
...应该是:
通过向
Collectors.toMap
调用传递另一个参数(Map工厂,如TreeMap :: new
)来指定NavigableMap
的具体实现。我们还必须传递一个merge函数,以决定在出现重复元素时如何处理。有关Collectors.toMap
的重载,请参阅Javadoc。在这种方法中,数据库排序变得多余,因为您是在Java端排序,所以可以删除SQL行:
但是,按照预先排序的顺序向
TreeMap
添加元素可能有助于提高map的排序性能(这只是我的猜测),所以我会考虑保留ORDER BY
。如果你想返回一个不可修改的Map,使用
Collectors.toUnmodifiableMap
和相同的参数。示例代码
下面是一些示例代码。
首先,输入一些数据,来模拟你的数据库查询.
逻辑是,我们从数组的数组中检索每一行,通过从零开始的索引计数(
0
&1
)从每一行/数组中提取第一个和第二个元素,然后将它们收集到一个NavigableMap
中,具体来说是TreeMap
。或者,如果你不需要看到类型声明,使用下面的代码。你的情况很复杂,为了清晰起见,我个人会保留类型声明。这样做可以防止你在命名
oldTuple , newTuple
时犯的错误,而实际上合并的是String
值对象oldValue, newValue
。结果:
map.toString()= {阿尔伯塔省= AB,不列颠哥伦比亚省= BC,马纳托布省= MB,新不伦瑞克省= NB,纽芬兰和拉布拉多省= NL,新斯科舍省= NS,安大略省= ON,爱德华王子岛省= PE,魁北克省= QA,萨斯喀彻温省= SK}
我们可以跳过不需要的行。
Stream :: filter
的呼叫。Predicate
。注意 predicate 中的!
。我们正在过滤元素以 * 保留 *,而不是 * 丢失 *。