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

널 포인트 에러를 잡고 싶습니다.

0 추천
특정 값의 평균을 구하고 그 값들을 내림차순으로 정렬하는건데 
 
정렬 후 널값이 발생합니다. 
 
System.out.println("unsorted map");
		for (String key : map.keySet()) {
			int value = Integer.parseInt(String.valueOf(Math.round(map.get(key))));
			System.out.println("key/value: " + key + "/" + value/*map.get(key)*/);
		}
		
		tm.putAll(map);
		System.out.println("results");
		ArrayList<String> resultList = new ArrayList<String>();
		ArrayList<Double> dou_list = new ArrayList<Double>();
		ArrayList<String> str_list = new ArrayList<String>();
		for (String key : tm.keySet()) {
			System.out.println("key/value: " + key + "/" + tm.get(key));
			dou_list.add(tm.get(key));
			str_list.add(key);
		}
		for(int i=0; i<5 ;i ++){
			double dou = 0;
			resultList.add(str_list.get(i));
			if(dou_list.get(i) == null){
				dou = dou_list.get(i-1)-0.0001;
				int value = (int)dou;
				String str = Integer.toString(value);
				resultList.add(str);
			}else{
				dou = dou_list.get(i);
				int value = (int)dou;
				String str = Integer.toString(value);
				resultList.add(str);
			}
	      	
	      }
		for(int i=0; i<resultList.size();i ++){
			System.out.println(i+"번째"+resultList.get(i));
	      }
		return resultList;

 

지금 소스가 이런 형태인데 정렬되지 않았을때는 값이 잘 들어갑니다.
 
그런데 밑에서 보시다시피 정렬후 널값으로 표시 되는데 저게 어디가 문제인지 잘 모르겠습니다.
 
제가 어떻게 해결해보려고
if(dou_list.get(i) == null){
dou = dou_list.get(i-1)-0.0001;
int value = (int)dou;
String str = Integer.toString(value);
resultList.add(str);
}
 
이런 코드를 넣었긴 했는데무용지물이구요
 
02-05 02:06:47.697: I/System.out(7931): unsorted map
02-05 02:06:47.697: I/System.out(7931): key/value: LW/65
02-05 02:06:47.697: I/System.out(7931): key/value: CAM/65
02-05 02:06:47.697: I/System.out(7931): key/value: RB/59
02-05 02:06:47.697: I/System.out(7931): key/value: CB/62
02-05 02:06:47.697: I/System.out(7931): key/value: LM/67
02-05 02:06:47.697: I/System.out(7931): key/value: RM/67
02-05 02:06:47.697: I/System.out(7931): key/value: LB/59
02-05 02:06:47.697: I/System.out(7931): key/value: ST/67
02-05 02:06:47.697: I/System.out(7931): key/value: LWB/66
02-05 02:06:47.697: I/System.out(7931): key/value: CDM/61
02-05 02:06:47.697: I/System.out(7931): key/value: RW/65
02-05 02:06:47.701: I/System.out(7931): key/value: CF/67
02-05 02:06:47.701: I/System.out(7931): key/value: SW/67
02-05 02:06:47.701: I/System.out(7931): key/value: GK/65
02-05 02:06:47.701: I/System.out(7931): key/value: RWB/66
02-05 02:06:47.701: I/System.out(7931): key/value: CM/66
02-05 02:06:47.705: I/System.out(7931): results
02-05 02:06:47.705: I/System.out(7931): key/value: CF/66.84615384615384
02-05 02:06:47.705: I/System.out(7931): key/value: ST/66.66666666666667
02-05 02:06:47.705: I/System.out(7931): key/value: SW/66.58333333333333
02-05 02:06:47.705: I/System.out(7931): key/value: RM/66.5
02-05 02:06:47.705: I/System.out(7931): key/value: LM/66.5
02-05 02:06:47.708: I/System.out(7931): key/value: RWB/65.61538461538461
02-05 02:06:47.708: I/System.out(7931): key/value: LWB/65.61538461538461
02-05 02:06:47.708: I/System.out(7931): key/value: CM/65.53846153846153
02-05 02:06:47.708: I/System.out(7931): key/value: GK/65.28571428571429
02-05 02:06:47.708: I/System.out(7931): key/value: RW/null
02-05 02:06:47.708: I/System.out(7931): key/value: LW/null
02-05 02:06:47.712: I/System.out(7931): key/value: CAM/65.16666666666667
02-05 02:06:47.712: I/System.out(7931): key/value: CB/62.416666666666664
02-05 02:06:47.712: I/System.out(7931): key/value: CDM/60.92857142857143
02-05 02:06:47.712: I/System.out(7931): key/value: LB/59.23076923076923
02-05 02:06:47.712: I/System.out(7931): key/value: RB/null
02-05 02:06:47.712: I/System.out(7931): 0번째CF
02-05 02:06:47.712: I/System.out(7931): 1번째66
02-05 02:06:47.712: I/System.out(7931): 2번째ST
02-05 02:06:47.712: I/System.out(7931): 3번째66
02-05 02:06:47.712: I/System.out(7931): 4번째SW
02-05 02:06:47.712: I/System.out(7931): 5번째66
02-05 02:06:47.712: I/System.out(7931): 6번째RM
02-05 02:06:47.712: I/System.out(7931): 7번째66
02-05 02:06:47.712: I/System.out(7931): 8번째LM
02-05 02:06:47.712: I/System.out(7931): 9번째66
 
 
 
 
그리고 아무 값도 입력하지 않았을때도 널값이 납니다.
이런식으로요 
 
02-05 02:07:03.025: I/System.out(7931): unsorted map
02-05 02:07:03.025: I/System.out(7931): key/value: LW/0
02-05 02:07:03.025: I/System.out(7931): key/value: CAM/0
02-05 02:07:03.025: I/System.out(7931): key/value: RB/0
02-05 02:07:03.025: I/System.out(7931): key/value: CB/0
02-05 02:07:03.025: I/System.out(7931): key/value: LM/0
02-05 02:07:03.025: I/System.out(7931): key/value: RM/0
02-05 02:07:03.025: I/System.out(7931): key/value: LB/0
02-05 02:07:03.025: I/System.out(7931): key/value: ST/0
02-05 02:07:03.025: I/System.out(7931): key/value: LWB/0
02-05 02:07:03.029: I/System.out(7931): key/value: CDM/0
02-05 02:07:03.029: I/System.out(7931): key/value: RW/0
02-05 02:07:03.029: I/System.out(7931): key/value: CF/0
02-05 02:07:03.029: I/System.out(7931): key/value: SW/0
02-05 02:07:03.029: I/System.out(7931): key/value: GK/0
02-05 02:07:03.029: I/System.out(7931): key/value: RWB/0
02-05 02:07:03.029: I/System.out(7931): key/value: CM/0
02-05 02:07:03.029: I/System.out(7931): results
02-05 02:07:03.029: I/System.out(7931): key/value: CM/0.0
02-05 02:07:03.029: I/System.out(7931): key/value: RWB/0.0
02-05 02:07:03.029: I/System.out(7931): key/value: GK/0.0
02-05 02:07:03.029: I/System.out(7931): key/value: SW/null
02-05 02:07:03.029: I/System.out(7931): key/value: CF/0.0
02-05 02:07:03.029: I/System.out(7931): key/value: RW/null
02-05 02:07:03.029: I/System.out(7931): key/value: CDM/null
02-05 02:07:03.029: I/System.out(7931): key/value: LWB/null
02-05 02:07:03.029: I/System.out(7931): key/value: ST/0.0
02-05 02:07:03.029: I/System.out(7931): key/value: LB/null
02-05 02:07:03.029: I/System.out(7931): key/value: RM/null
02-05 02:07:03.033: I/System.out(7931): key/value: LM/null
02-05 02:07:03.033: I/System.out(7931): key/value: CB/null
02-05 02:07:03.033: I/System.out(7931): key/value: RB/null
02-05 02:07:03.033: I/System.out(7931): key/value: CAM/null
02-05 02:07:03.033: I/System.out(7931): key/value: LW/null
 
 
널 값의원인이 뭔가요? 
 
아무 값도 입력 안하면 다 0인데도 널 값이 납니다.
 
브루스웨인 (8,580 포인트) 님이 2014년 2월 5일 질문

2개의 답변

+1 추천
 
채택된 답변

정렬하는 코드가 제대로 작동안해서 그런가보네요..

class ValueComparator implements Comparator<String> {
    private Map<String, Double> base;
    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }

    @Override
    public int compare(String a, String b) {
        if (base.get(a) <= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}
public static void main(String[] args) {
        HashMap<String,Double> map2 = new HashMap<String,Double>();
        ValueComparator bvc =  new ValueComparator(map2);
        TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);

        map2.put("A",99.5);
        map2.put("B",67.4);
        map2.put("C",67.4);
        map2.put("D",67.3);
        map2.put("E",67.3);
        System.out.println("unsorted map: "+map2);
        sorted_map.putAll(map2);
        System.out.println("results: "+sorted_map);
}

 

출처 : http://stackoverflow.com/a/1283722

bangbang (8,820 포인트) 님이 2014년 2월 5일 답변
브루스웨인님이 2014년 7월 19일 채택됨
현재 제 코드가

class ValueComparator implements Comparator<Object> {
    Map<String, Double> base;

    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }

    @Override
    public int compare(Object a, Object b) {
        if (base.get(a) < base.get(b)) {
            return 1;
        } else if (base.get(a) == base.get(b)) {
            return 0;
        } else {
            return -1;
        }
    }

}


이렇게 되어있는데 compare코드에서
public int compare(String a, String b) {
        if (base.get(a) <= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
이렇게 해주면 에러가 납니다.
이 조건에서 문제가 생기는거 같은데 많이 어렵네요 ㅠ
코드 바꾸시고 에러 나셨다면 에러로그라도 올려주시지
아 죄송합니다. 깜빡했네요.. 에러로그가 이렇습니다.

밑에서 배열 인덱스가 없어서 나는 에러? 같습니다.

에러 나는 부분이
for(int i=0; i<5 ;i ++){
            double dou = 0;
            resultList.add(str_list.get(i));
            if(dou_list.get(i) == null){
                dou = dou_list.get(i-1)-0.0001; //여기입니다.
                int value = (int)dou;
                String str = Integer.toString(value);
                resultList.add(str);
            }else{
                dou = dou_list.get(i);
                int value = (int)dou;
                String str = Integer.toString(value);
                resultList.add(str);
            }

02-07 22:04:36.078: E/AndroidRuntime(8605): FATAL EXCEPTION: main
02-07 22:04:36.078: E/AndroidRuntime(8605): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.app/com.test.app.OriginalActivity}: java.lang.ArrayIndexOutOfBoundsException
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.os.Looper.loop(Looper.java:123)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread.main(ActivityThread.java:3687)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at java.lang.reflect.Method.invokeNative(Native Method)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at java.lang.reflect.Method.invoke(Method.java:507)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at dalvik.system.NativeStart.main(Native Method)
02-07 22:04:36.078: E/AndroidRuntime(8605): Caused by: java.lang.ArrayIndexOutOfBoundsException
02-07 22:04:36.078: E/AndroidRuntime(8605):     at java.util.ArrayList.get(ArrayList.java:313)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at com.test.app.OriginalActivity.allAvg(OriginalActivity.java:1438)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at com.test.app.OriginalActivity.outputData(OriginalActivity.java:1460)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at com.test.app.OriginalActivity.onCreate(OriginalActivity.java:195)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-07 22:04:36.078: E/AndroidRuntime(8605):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
02-07 22:04:36.078: E/AndroidRuntime(8605):     ... 11 more
for 문 돌면서 int =0 으로 선언하셨는데
당연히 arraylist.get(i) 하실때 dou_list.get(i-1) 하니까 ArrayIndexOutOfBoundsException 오류가 나오는거 같네요.
아 답변감사합니다.

그런데 이게 정렬된 값들이 아예 전부 널이 떨어져 버립니다.

정렬코드는
class ValueComparator implements Comparator<Object> {
    Map<String, Double> base;

    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }

    @Override
    public int compare(Object a, Object b) {
         if (base.get(a) <= base.get(b)) {
                return -1;
            } else {
                return 1;
            }
    }

}
이거구 에러는 위에 에러랑 똑같습니다.

왜 그러는건지 도통 모르겠어요 ㅠㅠ

for(int i=0; i<5 ;i ++){
            double dou = 0;
            resultList.add(str_list.get(i));
            dou = dou_list.get(i);
            int value = (int)dou;
            String str = Integer.toString(value);
            resultList.add(str);
             
          }

02-12 23:06:02.198: I/System.out(6739): key/value: RWB/null
02-12 23:06:02.198: I/System.out(6739): key/value: LWB/null
02-12 23:06:02.198: I/System.out(6739): key/value: LB/null
02-12 23:06:02.198: I/System.out(6739): key/value: RB/null
02-12 23:06:02.198: I/System.out(6739): key/value: SW/null
02-12 23:06:02.198: I/System.out(6739): key/value: CF/null
02-12 23:06:02.198: I/System.out(6739): key/value: CB/null
02-12 23:06:02.198: I/System.out(6739): key/value: ST/null
02-12 23:06:02.198: I/System.out(6739): key/value: CDM/null
02-12 23:06:02.198: I/System.out(6739): key/value: CM/null
02-12 23:06:02.198: I/System.out(6739): key/value: RM/null
02-12 23:06:02.198: I/System.out(6739): key/value: LM/null
02-12 23:06:02.198: I/System.out(6739): key/value: RW/null
02-12 23:06:02.198: I/System.out(6739): key/value: LW/null
02-12 23:06:02.198: I/System.out(6739): key/value: CAM/null
02-12 23:06:02.198: I/System.out(6739): key/value: GK/null
0 추천
aucd29 (218,390 포인트) 님이 2014년 2월 5일 답변
...