如果一个Object对象可能是集合或者数组那么如何对其进行迭代

  需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是集合,包括Collection和Map,也可能是数组,包括对象类型数组和基本数据类型数组,那么如何将这个对象中的元素进行迭代,同时添加进一个集合中(我们不关心添加迭代出来的值是什么类型)。

 

  分析:由于这个Object对象(假设为items)可能是Collection集合,也可能是Map集合,可能是对象类型数组,还可能是基本数据类型数组,但不管怎么样,集合或数组都逃不出这四种类型。关于对象类型数组和基本类型数组的迭代,请看上一篇博客。

  那么要进行迭代之前,我们首先要来判断这个Object对象是什么类型,如果是Collection集合或者Map集合,那么如何迭代?尤其是Map集合。

 

  解决:将所有的集合或者数组全部转换为Collection集合,如果本来就是Collection集合的子类对象,那么不需要做任何改变,如果是Map集合,那么就调用Map集合的entrySet方法获取Set集合对象(Set集合也是Collection集合的子类),如果是数组对象,不管是对象类型数组还是基本数据类型数组,使用集合类Array来迭代每个元素,封装到一个Collection集合对象中即可,这一点已经在上一篇博客中体现了。

代码:

 1 public Collection setItems(Object items) {
 2     if(items instanceof Collection) {
 3         return (Collection) items;
 4     }
 5         
 6     if(items instanceof Map) {
 7         Map map = (Map) items;
 8         return map.entrySet();  //Set
 9     }
10         
11     if(items.getClass().isArray()) {
12         Collection coll = new ArrayList();
13         int length = Array.getLength(items);
14         for(int i=0;i<length;i++) {
15             Object value = Array.get(items, i);
16             coll.add(value);
17         }
18         return coll;
19     }
20         
21     return null;
22 }

应用1:

1   List list = new ArrayList();
2   list.add("aaa");
3   list.add("bbb");
4   list.add("ccc");
5   Collection collection = setItems(list);
6    System.out.println(collection);

结果:[aaa, bbb, ccc]

应用2:

1   Map map = new HashMap();
2   map.put("aa", "aaaa");
3   map.put("bb", "bbbb");
4   Collection collection = setItems(map);
5   System.out.println(collection);

结果:[aa=aaaa, bb=bbbb]

  注意因为在setItems方法中,对Map集合进行了entrySet方法的调用,因此我们迭代的是Set集合。

应用3:

1     int[] arr = {1,2,3,4,5};
2     System.out.println(setItems(arr));

结果:[1, 2, 3, 4, 5]

应用4:

1     String[] arr = {"long","live","sd"};
2     System.out.println(setItems(arr));

结果:[long, live, sd]

posted @ 2016-03-13 16:16  fjdingsd  阅读(2981)  评论(0编辑  收藏  举报