操纵java数组[转]

原创 2005年04月24日 10:45:00

如果你做过很多java程序,你可能对java集合类很熟悉,例如Vector和ArrayList。你可以创建一个集合并向其中增加元素:

    List lst = new ArrayList();    lst.add(new Integer(37));

在这个特殊的范例中,一个整型值37用于构造一个Integer封装类对象,然后那个对象被加入到列表。

这个简单的范例展示集合的一个基础-他们用于操纵一列对象,其中的每个对象是一个类或者接口类型。因此,一个ArrayList可以包含Object,String,Float以及Runnable类型的对象。集合类不能用于原始数据类型的列表,例如整型数组。

如果你在你的程序中使用原始类型的数组,你如何操纵它们呢?这个技巧就给你展示几个你可以使用的技术。

第一个技术是排序。java.util.Arrays类包含一套排序和查找数组的类方法,例如:

  import java.util.Arrays;  
   public class ArrayDemo1
   {
         public static void main(String args[])
         {     
         int vec[] = {37, 47, 23, -5, 19, 56}; 
            Arrays.sort(vec);      
        for (int i = 0; i < vec.length; i++)
         {    
              System.out.println(vec[i]);   
           }       
   }   
    }
这个演示程序初始化一个整数数组然后调用Arrays.sort升序排序那个数组。

类似的,你可以在排完序的数组上进行二分法查找:

   import java.util.Arrays;  
   public class ArrayDemo2
   {  
       public static void main(String args[])
       { 
           int vec[] = {-5, 19, 23, 37, 47, 56};   
           int slot = Arrays.binarySearch(vec, 35);
           slot = -(slot + 1);   
             System.out.println("insertion point = " + slot);       
         }   
         }
这个程序有个微妙的概念,如果二分法查找失败它将返回:

-(insertion point) - 1

这个演示程序以参数35调用查找方法,而那个参数在数组中不存在,方法返回值-4,如果这个值加一再取其负数就得到3,这就是35应该被插入到数组中的位置,换言之,值-5, 19和23在数组中占据的位置是0,1和2。因此值35应该在索引3的位置,而37, 47以及56顺延。搜索方法并不进行实际的插入操作而只是指出应该在何处插入。

除了排序和查找,我们还可以对原始类型数组做什么?另一个有用的技术是将一个原始数组转换为等价的对象类型数组。每个对应元素使用它们的封装器类,例如在封装数组中,37成为Integer(37)。

   import java.util.Arrays; 
   import java.lang.reflect.Array; 
  
   public class ArrayDemo3 {   
   // if input is a single-dimension primitive array,
      // return a new array consisting of wrapped elements,   
   // else just return input argument           
    public static Object toArray(Object vec) { 
               // if null, return     
           if (vec == null)
           {       
            return vec;           
         }         
   // if not an array or elements not primitive, return               
    Class cls = vec.getClass();      
       if (!cls.isArray())
       {               
   return vec;           
   }         
    if (!cls.getComponentType().isPrimitive())
    {     
            return vec;           
         }       
         // get array length and create Object output array               
         int length = Array.getLength(vec);   
         Object newvec[] = new Object[length]; 
               // wrap and copy elements             
    for (int i = 0; i < length; i++)
    {     
          newvec[i] = Array.get(vec, i);           
         }   
              return newvec;       
         }      
       public static void main(String args[])
       {
                 // create a primitive array  
              int vec[] = new int[]{1, 2, 3};  // wrap it               
              Object wrappedvec[] =(Object[])toArray(vec);   
             // display result           
      for (int i = 0; i < wrappedvec.length; i++)
      {               
       System.out.println(wrappedvec[i]);           
      }       
  }   
  }

方法"toArray"的参数是一个Object对象(数组可以被赋值给一个Object引用)。如果参数是null或者代表的不是原始类型数组那么这个方法简单的返回参数值。java.lang.Class工具类用于判断参数是否是一个数组并获取数组的底层元素的类型。

一旦做完这些检查,使用java.lang.reflect.Array工具类的反射工具方法就可以获取原始数组的长度并获得数组的单个元素。Array.get获得的每个元素被返回到封装器类中,例如Integer或者Double。

最终的范例基于前面的那个并向你展示如何在数组上使用集合特性。这假设你已经有一个对象数组。
 
      import java.util.Arrays;  
    import java.util.List;  
   public class ArrayDemo4 { 
        public static void main(String args[])
        {  
           Object vec[] = {new Integer(37), new Integer(47)};           
           List lst = Arrays.asList(vec);   
          lst.set(1, new Integer(57));    
         for (int i = 0; i < vec.length; i++)
         {               
          System.out.println(vec[i]);           
         }       
  }   
  }
在这个程序中,vec是一个对象数组,包含Integer(37)和Integer(47),然后Arrays.asList被调用。它返回一个集合(List接口类型),使用数组作为集合的后台存储。换言之,ArrayList这样的集合类型在它内部有某种存储类型去存储集合元素。在这个例子中,使用的存储类型是作为参数传

JAVA二维数组转秩

  • 2014年05月07日 22:57
  • 490B
  • 下载

java字符串转String数组简单实例

  • 2016年01月06日 14:21
  • 432B
  • 下载

操纵java数组

操纵java数组如果你做过很多java程序,你可能对java集合类很熟悉,例如Vector和ArrayList。你可以创建一个集合并向其中增加元素:    List lst = new Array...

二维数组转json的java源码

  • 2015年10月12日 13:08
  • 662B
  • 下载

Java byte[] 字节数组 转 二进制 八进制 十进制 十六进制字符串

Java byte[] 字节数组 转 二进制 八进制 十进制 十六进制字符串

Android/Java 读取txt,转二维数组

今天这个,愁了一个早上,好在最后被我瞎搞搞出来了、、貌似markdown的代码块有点难看啊 -.- 思路:读取文档,把文档转化成 ArrayList,再将 ArrayList 转到二维数组里。 我这边...

数据结构之数组和字符串的反转java实现

采用java实现数组和字符串的反转

Java byte数组与十六进制字符串互转

Java byte数组与十六进制字符串互转 Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示。 所以我们就可以把每个byte转换成两个相应的16进...

JSON数组转Java List

本文使用alibaba开源项目fastjson与SourceForge开源项目JSON-lib两种方法转换json。 现有json文件user.json如下: [ { "userid": ...
  • baalhuo
  • baalhuo
  • 2016年10月24日 23:17
  • 454

java中 数组 list map之间的互转

三者之间转换关系,一张图清晰呈现。 上代码: 其中的maputils是apache的collection包。 package util; import java.util.Arra...
  • zchunhe
  • zchunhe
  • 2013年10月24日 23:19
  • 3982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:操纵java数组[转]
举报原因:
原因补充:

(最多只允许输入30个字)