Сортировать Apache Commons MultiValuedMap по ключу - PullRequest
0 голосов
/ 21 июня 2019

Я хотел бы знать, как отсортировать Apache Commons MultiValuedMap по Key. Ниже приведен используемый класс ключей.

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

        }

Мне нужно добиться порядка на карте.

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

В принципе, вы не можете сортировать HashMap.Если вам нужно сохранить определенный порядок на вашей карте, рекомендуется использовать реализацию Map, например TreeMap .

Что вы можете сделать, если хотите перебрать HashMap в определенном порядке, это получить ключи и отсортировать их.Затем вы можете перебирать ключи и искать значения соответственно:

HashMap<String, List<String>> map = new HashMap<>();
for(String key : new TreeSet<String>(map.keySet())){
    map.get(key);
}
1 голос
/ 21 июня 2019

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