首页 > 解决方案 > 更改 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]}

标签: javaguava

解决方案


如果您不想触及逻辑本身,一个解决方案是更改初始化。

使用 aTreeMultiMapComparatoron 值始终将其放在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]}

推荐阅读