【问题标题】:Populate array with null values用空值填充数组
【发布时间】:2013-09-30 16:41:11
【问题描述】:

也许这是一个简单的问题。 但是,我想知道为什么我们不能用空值填充数组或集合? 请看这样简单的例子:

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++;

   }
}

我很乐意听取您的意见。

【问题讨论】:

  • 该代码有什么问题?
  • Map 有一个size 方法,所以不需要map.values().size() 只需使用map.size()
  • 我们不能用 null 填充数组或集合这不是真的......
  • 有些集合允许空值,有些不允许。
  • array2 - 不填充空值。

标签: java arrays collections


【解决方案1】:

对象数组在实例化时填充有null 值。另一方面,集合一开始是空的,所以一开始就没有什么可以“填充”的——好吧,如果你愿意,你可以用null 值填充它们,但那有什么意义呢?仅根据需要将元素添加到Collection,用null 值填充它是没有意义的(并非所有集合都允许它,这取决于类型)。

【讨论】:

    【解决方案2】:

    您可以使用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]
    

    【讨论】:

      【解决方案3】:

      在你的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
      

      【讨论】:

      • 有趣的是,在 IDE(调试器)中我们看不到具有空值的元素。
      • 也许必须在调试器中更改一些设置;正如您在上面看到的,这些值肯定存在。也许某处有“不显示空值”开关?
      【解决方案4】:

      当使用泛型时,我认为最好的做法是指定比 Object 更具体的东西,以便更安全。因此,您可能希望将 HashMap 更新为:

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

      然后您可以创建空 BigDecimal 对象来填充您的地图。

      【讨论】:

      • 在我的情况下,我应该使用 Object,因为我需要不同的类型来存储在地图中。喜欢:日期、整数、字符串、BigDecimal
      • 考虑为您的类型创建一个通用接口,因为我认为这将生成更好的面向对象代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多