java - 更改 Multimap 中显示的值的顺序
问题描述
我正在研究 Multimap,我有一个简单的场景,我将键值对添加到 Multimap。下面是示例代码:
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class MatchingTest {
void loanApplication(final boolean loanApproved) {
final String text1 = "Loan";
final String text2 = "Home";
final Multimap<String, String> matchingMap = ArrayListMultimap.create();
if (loanApproved) {
matchingMap.put(text1 + ":" + text2, "getLoan");
}
matchingMap.put(text1 + ":" + text2, "setLoan");
if (!loanApproved) {
matchingMap.put(text1 + ":" + text2, "applyLoan");
}
System.out.println("matchingMap :: " + matchingMap);
}
public static void main(final String[] args) {
new MatchingTest().loanApplication(true);
new MatchingTest().loanApplication(false);
}
}
输出:
matchingMap :: {Loan:Home=[getLoan, setLoan, applyLoan]}
matchingMap :: {Loan:Home=[setLoan, applyLoan]}
预期输出:
matchingMap :: {Loan:Home=[getLoan, setLoan]}
matchingMap :: {Loan:Home=[applyLoan, setLoan]}
有没有一种方法,matchingMap 中的值总是 setLoan 值应该在最后一个显示的值中,而不改变上面类中给出的步骤,我知道这些值按照我们放置的顺序显示在课堂上,但我无法更改课堂上写的步骤。那么是否有任何逻辑(显示值的排序逻辑)我们可以控制哪些值应该首先显示在匹配映射值对中。
其他场景是我想从 Multimap 值对中显示的值中删除一个值。
EX)在下面的输出中,当有 getLoan 和 setLoan 值时,我不应该将 applyLoan 添加到值对中。
预期输出:
matchingMap :: {Loan:Home=[getLoan, setLoan]} // applyLoan is removed
matchingMap :: {Loan:Home=[setLoan, applyLoan]}
解决方案
如果您不想触及逻辑本身,一个解决方案是更改初始化。
使用 aTreeMultiMap
和Comparator
on 值始终将其放在set##
其他所有内容之后。
快速代码:
final TreeMultimap<String, String> matchingMap = TreeMultimap.create(
Comparator.naturalOrder(),
(s1, s2) -> s1.startsWith("set") ? 1 : -1
);
这会给:
matchingMap :: {Loan:Home=[getLoan, setLoan]}
matchingMap :: {Loan:Home=[applyLoan, setLoan]}
推荐阅读
- python - 在没有 Redis 的情况下使用 celery 4
- angular - Plotly.js 不适用于 SSR Angular 应用程序
- reactjs - 如何将我的 Reactjs Web 应用程序连接到安全的 MQTT 代理?
- reporting-services - 如何显示该日期没有值的日期
- java - 如何从文件中读取然后倒退?
- gurobi - 如何解决 gurobi 求解器中的导入错误
- python - 为什么这个类中的函数不使用更新的类属性?
- python - Numpy数组:不选择特定的行或列
- android - 如何使用改造 android 捕获图像和发布数据
- mysql - mysql查询不适用于条件