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

jon が言ったように、順序付けられたキーのリストを保持し、それを使用して本質的に順序付けられていないハッシュ マップにアクセスすることをお勧めします。

于 2013-10-26T09:31:03.493 に答える