2013-09-30 5 views
1

Возможно, это простой вопрос. Но, интересно, почему мы не можем заполнить массив или коллекцию нулевыми значениями? Пожалуйста, смотрите такой простой пример:Заполнение массива нулевыми значениями

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

«Карта» имеет метод 'size', поэтому нет необходимости в' map.values ​​(). Size() 'просто использовать' map.size() '. – cyon

+3

* мы не можем заполнить массив или коллекцию нулевым * Это не так ... – UmNyobe

ответ

0

Добавьте следующий код под свой цикл for, и вы увидите, что размеры, не равные размерам карты, тоже одинаковы.

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 (Debuger) мы не видим элементов с нулевыми значениями. –

+0

Возможно, некоторые параметры необходимо изменить в отладчике; как вы можете видеть выше, ценности, безусловно, есть. Может быть, где-то есть переключатель «Не показывать нулевые значения»? – blalasaadri

3

Объект array is, заселенный 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>(); 

Затем вы можете создать нулевые объекты BigDecimal заселить вашу карту.

+0

В моем случае я должен использовать Object, потому что мне нужны разные типы для хранения на карте. Например: Date, Integer, String, BigDecimal –

+1

Рассмотрите возможность создания общего интерфейса для ваших типов, поскольку я думаю, что это сделает лучший объектно-ориентированный код. – sreisman

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