마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

map 정렬 키값질문입니다.

0 추천
public static void main(String[] args) { 
		  int korean=80, mathmatics=30, society=67, english=90, history=56 ,science=77, art=80, training=46;

	        HashMap<String,Integer> map = new HashMap<String,Integer>(); 
	        ValueComparator bvc =  new ValueComparator(map); 
	        TreeMap<String,Integer> sorted_map = new TreeMap<String,Integer>(bvc); 
	        
	        int engineer = (mathmatics + science+ society + english)/4;
			int munkwa = (korean + english + society + history)/4;
			int talent = (korean + training + art + english)/4;

	        map.put("engineer",engineer); 
	        map.put("munkwa",munkwa); 	        
	        map.put("talent",talent); 
	 
	        System.out.println("unsorted map: "+map); 
	 
	        sorted_map.putAll(map); 
	 
	        System.out.println("results: "+sorted_map); 
	    } 
	} 
	 
	class ValueComparator implements Comparator<String> { 
	 
	    Map<String, Integer> base; 
	    public ValueComparator(Map<String, Integer> base) { 
	        this.base = base; 
	    } 
	 
	    // Note: this comparator imposes orderings that are inconsistent with equals.     
	    public int compare(String a, String b) { 
	        if (base.get(a) >= base.get(b)) { 
	            return -1; 
	        } else { 
	            return 1; 
	        } // returning 0 would merge keys 
	    } 

결과

 

unsorted map: {talent=74, engineer=66, munkwa=73}
results: {talent=74, munkwa=73, engineer=66}
 
 
제가 궁금한건
map.put("engineer",engineer); 
	        map.put("munkwa",munkwa); 	        
	        map.put("talent",talent); 
이 부분입니다. 
키값 부분인데요 . 위 소스는 키값을 직접 지정해준건데 그렇게 안하고 자동으로 집어넣게 해주려면 어떻게 하는게 좋을까요?
 
engineer의 평균은 engineer라고 키값이 자동으로 판단해서 들어가게 해주고 싶습니다.
 
 
아 그리고 정렬은 키값으로 한다고 헀는데 여기서는 벨류값으로 정렬이 된 이유도 궁금하구요
브루스웨인 (8,580 포인트) 님이 2013년 8월 22일 질문

1개의 답변

0 추천
 
채택된 답변
  1. key 를 자동화 시키는게 프로그래머 의 몫이죠 그것까지 자동으로 해주면 얼마나 좋겠습니까만은  
  2. 코드 보시면 ValueComparator  에서 compare 를 보면 값 비교를 하고 그에 따라서 1과 -1 를 반환 합니다. 그에 따른 순서 입니다.
aucd29 (218,390 포인트) 님이 2013년 8월 22일 답변
브루스웨인님이 2013년 8월 23일 채택됨
아..제가 원하는 기능을 만들려면 해쉬맵을 쓰는게 맞는건지도 헷갈리네요..
제가 생각해도 맵 류가 맞아 보입니다.
고민하는게 engineer의 평균값을 맵에 넣는데 현재는 개발자가 키값으로 engineer다 라고 명시를 해줘야되는데

제가 하려는건 engineer의 평균값이 나오면 이건 engineer의 평균값이다라고 알아서 판단을 해주게 하고 싶거든요.
판단을 하고나면 키값에 따라 지정된 engineer의 사진이 어플에서 출력되게 하려구요.(engineer 키값이라면 이 사진을 출력하게 지정)

그런데 평균값은 항상 바뀌는 값이고 다른 값과 같아질 경우도 있어서
이를 구분하기 위해 평균값이 나오면 이건 어떤 평균이다라고 자동으로 지정을 해주려는건데 이 부분을 어떻게 해야할지 고민이네요.
1. 값 자체가 engineer, 또는 others 인지 구분이 되나요 즉 값을 전달 받을 때 key 값이 존재 하는가요?
 > true : key 값을 기준으로 index 하시면 될 것이구요 그 값에 평균을 구하는건 쉽겠지요.
> false : 구분이라는 근본 자체가 없으면, 조건 자체가 성립이 안되므로  값을 전달 하는 쪽에 구분자를 요청해야할 것 같은데요

들어오는 값 [{"엔지니어":1}, {"건축인", 10}]

map<엔지니어, 값>
map<건축인, 값>
평균은 map 의 값을 avg  

자동이라는 의미가 먼가 확 저한테 다가 오진 않네요 +_+
저도 설명을 뭘로 하는게 좋을가 하다가 탐탁치 않지만 자동이라고 설명을 하게됐네요.  평균은 map의 값을 이용하는게 아니라 개별 평균값을 담는 용도로 생각하고 있구요
<엔지니어,엔지니어 평균값>
이런 식으로요. 요놈의 키값이 문제네요ㅕ..
답변 감사합니다. 더 고민을 해봐야겠네요..
...