Search code examples
javaapache-commonsapache-commons-collection

Sort Apache Commons MultiValuedMap by Key


I would like to know how to sort Apache Commons MultiValuedMap by Key. The below is the key class used.

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;
    }

}

The below map is constructed by iterating SummerDataOracle values. The values are pushed into the map by VssKey object as shown below.

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);

        }

I need to achieve the order in the Map.

Thanks


Solution

  • HashMap/MultivaluedHashMap cannot be sorted directly. Better, to get its key and sort them and parse map in sorted order.

    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));
        }