2013-09-30 2 views
1

아마도 간단한 질문입니다. 하지만 왜 배열이나 컬렉션에 null 값을 채울 수 없는지 궁금합니다. 같은 간단한 예를보고하십시오 :null 값으로 배열 채우기

public static void main(String[] args) { 

    Map<String, Object> map = new HashMap<>(); 
    map.put("first",null); 
    map.put("first1",new BigDecimal(1.5)); 
    map.put("first2",new BigDecimal(2.5)); 
    map.put("first3",new BigDecimal(3.5)); 


    String[]array1 = new String[map.values().size()]; 
    Object[]array2 = new Object[map.values().size()]; 

    int counter = 0; 

    for(Map.Entry<String,Object> entry: map.entrySet()){ 

     String header = entry.getKey(); 
     Object value = entry.getValue(); 

     array1[counter] = header; 
     array2[counter] = value; 

     counter++; 

    } 
} 

나는 당신의 목적을 듣고 기꺼이 것입니다.

+5

해당 코드의 문제점은 무엇입니까? –

+0

'Map'은'size' 메소드를 가지고 있으므로'map.values ​​(). size()'는'map.size()'를 사용하지 않아도됩니다. – cyon

+3

* 배열 또는 컬렉션에 null을 채울 수 없습니다. * 사실이 아닙니다. – UmNyobe

답변

0

for-loop 아래에 다음 코드를 추가하면 크기가지도의 크기와 같을뿐만 아니라 요소도 동일합니다.

System.out.println("counter = " + counter); 
System.out.println("array1.length = " + array1.length); 
for(int i=0; i<array1.length; i++) { 
    System.out.printf("- array1[%d] = %s\n", i, array1[i]); 
} 
System.out.println("array2.length = " + array2.length); 
for(int i=0; i<array2.length; i++) { 
    System.out.printf("- array2[%d] = %s\n", i, array2[i]); 
} 

아마 같은 순서로 당신의 값을 입력하지만이되는 HashMap의 성격 때문입니다되지 않습니다 순서. 출력 내용 :

counter = 4 
array1.length = 4 
- array1[0] = first3 
- array1[1] = first2 
- array1[2] = first 
- array1[3] = first1 
array2.length = 4 
- array2[0] = 3.5 
- array2[1] = 2.5 
- array2[2] = null 
- array2[3] = 1.5 
+0

흥미로운 점은 IDE (디버거)에서 null 값을 가진 요소를 볼 수 없다는 것입니다. –

+0

디버거에서 일부 설정을 변경해야 할 수도 있습니다. 위에서 볼 수 있듯이 값은 분명히 있습니다. 어딘가에서 "null 값 표시 안 함"스위치가있을 수 있습니까? – blalasaadri

3

개체 배열 은 구체화 될 때 null 값으로 채워지는입니다. 반면에 컬렉션은 처음에는 비어 있으므로 처음에는 "채워질"수있는 것이 없습니다. 원한다면 null 값으로 채울 수 있지만, 그 점은 무엇이겠습니까? 필요에 따라 요소를에서 Collection까지만 추가하면 null 값으로 채우는 것은 의미가 없습니다 (모든 컬렉션이 허용하는 것은 아니며 유형에 따라 다름).

1

당신은 값으로 배열, 예를 채우기 위해 Arrays.fill를 사용할 수 있습니다

String[] arr = new String[5]; 
System.out.println(Arrays.deepToString(arr)); 
Arrays.fill(arr,"initial value"); 
System.out.println(Arrays.deepToString(arr)); 
Arrays.fill(arr,null); 
System.out.println(Arrays.deepToString(arr)); 

출력 :

[null, null, null, null, null] 
[initial value, initial value, initial value, initial value, initial value] 
[null, null, null, null, null] 
0

제네릭을 사용하여, 나는 가장 좋은 방법은 객체보다 더 구체적인 뭔가를 지정하는 것입니다 생각을 더 형식 안전성이 있어야합니다. 그래서 당신은에의 HashMap를 업데이트 할 수 있습니다

Map<String, BigDecimal> map = new HashMap<Sting, BigDecimal>(); 

그런 다음 당신은 당신의지도를 채우는 널 (null)의 BigDecimal 객체를 생성 할 수 있습니다.

+0

제 경우에는 Object를 사용해야합니다. 왜냐하면지도에 저장하려면 여러 유형이 필요하기 때문입니다. Like : Date, Integer, String, BigDecimal –

+1

더 나은 객체 지향 코드를 만들 것이라고 생각하기 때문에 유형에 대한 공통 인터페이스를 만드는 것이 좋습니다. – sreisman