2013-10-26 3 views
0

Я пытаюсь сортировать хэш-файл, сортируя его ключи, но он не работает. Критерии сортировки задаются длиной списка, который является значением hashmap. См. Код ниже с некоторым модульным тестом.Java - Сортировка списка не работает

Класс:

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

} 

ответ

2

Plain HashMaps неотъемлемо неупорядоченными. Вы не можете сортировать их или предполагать что-либо о порядке, в котором записи извлекаются при их повторении. Варианты:

  • Использовать TreeMap, если вы хотите отсортировать по ключевому слову.
  • Используйте LinkedHashMap, если вы хотите, чтобы сохранить порядок вставки (который является то, что ваш метод sort выглядит, как он предполагает)
  • Создать список пар ключ/значение и вид, что вместо этого.
+0

Первое спасибо за ваш ответ. Я заменил HaspMap LinkedHashMap, но он все еще не работает. – user1582006

+0

Я использовал список и отсортировал его. Теперь это работает. Благодарю. – user1582006

0

Как я сказал, я предлагаю хранить упорядоченный список ключей и использовать его для доступа к неупорядоченной карте хэша.

Смежные вопросы