2013-10-26 2 views
0

해시 맵을 정렬하기 위해 노력하고 있지만 키를 정렬해도 작동하지 않습니다. 정렬 기준은 해시 맵의 값인 목록의 길이로 지정됩니다. 일부 단위 테스트와 함께 아래 코드를 참조하십시오.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

일반 HashMaps을 본질적으로 순서가 있습니다. 항목을 정렬 할 수 없으며 항목을 반복 할 때 항목을 검색하는 순서에 대해 아무 것도 생각할 수 없습니다. 옵션 :

  • 키순으로 정렬하려면 TreeMap을 사용하십시오. 당신이
  • 키/값 쌍의 목록을 작성하고 정렬하는 대신 (이 가정처럼 sort 방법은 모습입니다) 삽입 순서를 유지하려면
  • LinkedHashMap를 사용합니다.
+0

답장을 보내 주셔서 감사합니다. LinkedHashMap으로 HaspMap을 대체했지만 여전히 작동하지 않습니다. – user1582006

+0

목록을 사용하여 대신 목록을 정렬했습니다. 이제 작동합니다. 감사. – user1582006

0

존이 말한대로 키의 정렬 된 목록을 유지하고이를 사용하여 본질적으로 정렬되지 않은 해시 맵에 액세스하는 것이 좋습니다.

관련 문제