0

我正在尝试通过对键进行排序来对哈希图进行排序,但它不起作用。排序标准由作为哈希映射值的列表的长度给出。请参阅下面的代码和一些单元测试。

班级:

package com.fabri.interpreter.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import com.fabri.interpreter.VerbExpr;
import com.fabri.interpreter.ObjectExpr;

public class Environment {

    private HashMap<VerbExpr, List<ObjectExpr>> map = new HashMap<VerbExpr, List<ObjectExpr>>();

    public List<ObjectExpr> eval(VerbExpr verb) {
        return map.get(verb);
    }

    public void put(VerbExpr verb, ObjectExpr words) {
        List<ObjectExpr> values;
        if(map.get(verb) == null) 
            values = new ArrayList<ObjectExpr>();
        else
            values = map.get(verb);
        values.add(words);
        map.put(verb, values);
    }

    public HashMap<VerbExpr, List<ObjectExpr>> getMap() {
        return map;
    }

    public void sort() {
        List<VerbExpr> keys = new ArrayList<VerbExpr>(map.keySet());
        Collections.sort(keys, new Comparator<VerbExpr>() {
            @Override
            public int compare(VerbExpr verb1, VerbExpr verb2) {
                return map.get(verb1).size()-map.get(verb2).size();
            }
        });
        HashMap<VerbExpr, List<ObjectExpr>> sortedMap = new HashMap<VerbExpr, List<ObjectExpr>>();
        for(VerbExpr verb : keys) {
            sortedMap.put(verb, map.get(verb));
        }
        map = sortedMap;
    }

}

测试类:

package com.fabri.interpreter.util;

import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.fabri.interpreter.ObjectExpr;
import com.fabri.interpreter.VerbExpr;
import com.fabri.interpreter.WordExpr;

public class TestEnvironment {

    private Object[] verbExprs;

    @Before
    public void setUp() {
        Environment env = new Environment();
        List<WordExpr> words1 = new ArrayList<WordExpr>();
        words1.add(new WordExpr("american"));
        words1.add(new WordExpr("italian"));
        env.put(new VerbExpr("was"), new ObjectExpr(words1));
        List<WordExpr> words2 = new ArrayList<WordExpr>();
        words2.add(new WordExpr("zero"));
        words2.add(new WordExpr("one"));
        words2.add(new WordExpr("two"));
        env.put(new VerbExpr("is"), new ObjectExpr(words2));
        env.sort();
        verbExprs = env.getMap().keySet().toArray();
    }

    @Test
    public void testEnvironment() {
        assertTrue(((VerbExpr)verbExprs[0]).equals("is"));
        assertTrue(((VerbExpr)verbExprs[1]).equals("was"));
    }

}
4

2 回答 2

2

普通的哈希图本质上是无序的。您不能对它们进行排序,也不能假设在迭代它们时检索条目的顺序。选项:

  • TreeMap如果要按键排序,请使用 a 。
  • LinkedHashMap如果您想保留插入顺序,请使用 a (这是您的sort方法所假定的)
  • 创建一个键/值对列表并对其进行排序。
于 2013-10-26T09:24:06.597 回答
0

正如乔恩所说,我建议保留一个有序的键列表,并使用它来访问固有的无序哈希映射。

于 2013-10-26T09:31:03.493 回答