2

我想知道如何按键对 Apache Commons MultiValuedMap 进行排序。下面是使用的关键类。

public class VssKey implements Comparable<VssKey> {

    private String funCode;
    private String varntCode;
    private String itemNb;

    public VssKey(SummaryDataOracle summaryDataOracle) {
        this.funCode = summaryDataOracle.getFuncCode();
        this.varntCode = summaryDataOracle.getVariantCd();
        this.itemNb = summaryDataOracle.getItemNB();
    }

    public String getFunCode() {
        return funCode;
    }

    public void setFunCode(String funCode) {
        this.funCode = funCode;
    }

    public String getVarntCode() {
        return varntCode;
    }

    public void setVarntCode(String varntCode) {
        this.varntCode = varntCode;
    }

    public String getItemNb() {
        return itemNb;
    }

    public void setItemNb(String itemNb) {
        this.itemNb = itemNb;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((funCode == null) ? 0 : funCode.hashCode());
        result = prime * result + ((itemNb == null) ? 0 : itemNb.hashCode());
        result = prime * result + ((varntCode == null) ? 0 : varntCode.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        VssKey other = (VssKey)obj;
        if (funCode == null) {
            if (other.funCode != null)
                return false;
        } else if (!funCode.equals(other.funCode))
            return false;
        if (itemNb == null) {
            if (other.itemNb != null)
                return false;
        } else if (!itemNb.equals(other.itemNb))
            return false;
        if (varntCode == null) {
            if (other.varntCode != null)
                return false;
        } else if (!varntCode.equals(other.varntCode))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return String.format("VssKey [funCode=%s, varntCode=%s, itemNb=%s]", funCode, varntCode, itemNb);
    }

    @Override
    public int compareTo(VssKey o) {
        int k1 = Integer.parseInt(this.varntCode);
        int k2 = Integer.parseInt(o.getVarntCode());
        return k2 - k1;
    }

}

下面的地图是通过迭代SummerDataOracle值构造的。这些值按VssKey对象推送到地图中,如下所示。

MultiValuedMap<VssKey, String> partNumberVarientMap = new ArrayListValuedHashMap<>();

        for (SummaryDataOracle summaryDataOracle : summeryDataOracleList) {

            VssKey key = new VssKey(summaryDataOracle);

            String varntText = null;
            if (!StringUtils.isEmpty(summaryDataOracle.getVariantSmText())) {
                varntText = summaryDataOracle.getVariantSmText().trim();
            }

            partNumberVarientMap.put(key, varntText);

        }

我需要在地图中实现顺序。

谢谢

4

2 回答 2

1

按照设计,您不能对 HashMap 进行排序。如果您需要在地图中保持特定顺序,建议使用 Map 实现,如TreeMap

如果您想以特定顺序迭代 HashMap,您可以做的是获取键并对它们进行排序。然后您可以遍历键并相应地查找您的值:

HashMap<String, List<String>> map = new HashMap<>();
for(String key : new TreeSet<String>(map.keySet())){
    map.get(key);
}
于 2019-06-21T09:49:07.410 回答
1

HashMap/MultivaluedHashMap 不能直接排序。更好的是,获取它的键并对它们进行排序并按排序顺序解析地图。

Map<String, List<String>> map = new MultivaluedHashMap<>();
    map.put("b", new ArrayList<>());
    map.put("a", new ArrayList<>());

    List<String> keylist = new ArrayList<>(map.keySet());
    Collections.sort(keylist);
    for(String key : keylist) {
        System.out.println(key +  " : " + map.get(key));
    }
于 2019-06-21T09:56:19.093 回答