JAVA实现EXCEL公式专题(六)——查找引用函数

[java]  view plain  copy
  1. /** 
  2.  *  项目名称: 
  3.  *  文件说明: 
  4.  *  主要特点: EXCEL公式类型:查找公式 
  5.  *  版本号:1.0 
  6.  *  制作人:xxx 
  7.  *  创建时间:2013-12-3 
  8.  **/  
  9. package EXCEL;  
  10.   
  11. import java.util.Calendar;  
  12. import java.util.Date;  
  13.   
  14. /** 
  15.  * @author lcx 
  16.  * 
  17.  */  
  18. public class SearchFunctions {  
  19.   
  20.     /** 
  21.      * 返回指定数值在指定数组区域中的位置 
  22.      * @param lookupvalue 需要在数据表(lookup_array)中查找的值。 
  23.      * @param array :可能包含有所要查找数值的连续的单元格区域 
  24.      * @param type 表示查询的指定方式,用数字-1、0或者1表示。 
  25.      * @param type 为1时,查找小于或等于lookup_value的最大数值在lookup_array中的位置,lookup_array必须按升序排列: 
  26.      * 为0时,查找等于lookup_value的第一个数值,lookup_array按任意顺序排列: 
  27.      * 为-1时,查找大于或等于lookup_value的最小数值在lookup_array中的位置, 
  28.      * lookup_array必须按降序排列。利用MATCH函数查找功能时, 
  29.      * 当查找条件存在时,MATCH函数结果为具体位置(数值), 
  30.      * 否则显示#N/A错误。 
  31.      *  @return 
  32.      */  
  33.     public static int match(int lookupvalue,int[] array,int type)  
  34.     {  
  35.         int res=0;  
  36.         if(array==||array.length==0)  
  37.             throw new IllegalArgumentException("数组为空");  
  38.         //精确匹配  
  39.         if(type==0)  
  40.         {  
  41.             for(int i=0;i<array.length;i++)  
  42.             {  
  43.                 if(array[i]==lookupvalue)  
  44.                     return i+1;  
  45.             }  
  46.             throw new IllegalArgumentException("#N/A");  
  47.         }  
  48.   
  49.         //顺序匹配_正序匹配:在查找index的同时必须满足整个数组按照正序排列  
  50.         if(type>0)  
  51.         {  
  52.             if(lookupvalue<array[0])  
  53.                 throw new IllegalArgumentException("#N/A");  
  54.             for(int i=0;i<array.length-1;i++)  
  55.             {  
  56.                 if(array[i]>array[i+1])  
  57.                     throw new IllegalArgumentException("#N/A");  
  58.                 if(lookupvalue<array[i])  
  59.                     res=res>0?res:i;//已经找到了res 接下来就不用赋值了  
  60.             }  
  61.             if(lookupvalue>array[array.length-1])  
  62.                 res=array.length;  
  63.         }  
  64.   
  65.         //顺序匹配_正序匹配:在查找index的同时必须满足整个数组按照逆序排列  
  66.         if(type<0)  
  67.         {  
  68.             if(lookupvalue>array[0])  
  69.                 throw new IllegalArgumentException("#N/A");  
  70.             for(int i=0;i<array.length-1;i++)  
  71.             {  
  72.                 if(array[i]<array[i+1])  
  73.                     throw new IllegalArgumentException("#N/A");  
  74.                 if(lookupvalue>array[i])  
  75.                     res=res>0?res:i;  
  76.             }  
  77.             if(lookupvalue<array[array.length-1])  
  78.                 res=array.length;  
  79.         }  
  80.         return res;  
  81.     }  
  82.   
  83.       
  84.     public static int vlookup(int target,int[][] scan,int col)  
  85.     {  
  86.         if(scan.length==0||scan[0].length==0)  
  87.             return -Integer.MAX_VALUE;  
  88.         if(col>scan[0].length)  
  89.             return -Integer.MAX_VALUE;  
  90.   
  91.         for(int i=0;i<scan.length;i++)  
  92.         {  
  93.             if(target==scan[i][0])  
  94.                 return scan[i][col-1];  
  95.         }  
  96.         return -Integer.MAX_VALUE;  
  97.     }  
  98.   
  99.     public static int hlookup(int target,int[][] scan,int row)  
  100.     {  
  101.         if(scan.length==0||scan[0].length==0)  
  102.             return -Integer.MAX_VALUE;  
  103.         if(row>scan.length)  
  104.             return -Integer.MAX_VALUE;  
  105.   
  106.         for(int i=0;i<scan[0].length;i++)  
  107.         {  
  108.             if(target==scan[0][i])  
  109.                 return scan[row-1][i];  
  110.         }  
  111.         return -Integer.MAX_VALUE;  
  112.     }  
  113.       
  114.     public static int lookup(int target,int[] array1,int[] array2)  
  115.     {  
  116.         if(array1==||array2==)  
  117.             throw new IllegalArgumentException("#N/A:数组为空");  
  118.         if(array1.length!=array2.length)  
  119.             throw new IllegalArgumentException("#N/A:数组长度不匹配");  
  120.         int index=-1;  
  121.         for(int i=0;i<array1.length;i++)  
  122.         {  
  123.             if(target==array1[i])  
  124.             {  
  125.                 index=i;  
  126.             }  
  127.         }  
  128.         if(index<0)  
  129.             throw new IllegalArgumentException("#N/A:没有匹配项");  
  130.         return array2[index];  
  131.     }  
  132.       
  133.       
  134.     public static void main(String[] args) {  
  135.         /*******************测试查找引用函数*****************************/  
  136.         int[] a={25,35,45,55,65};  
  137.         int[] b={65,55,45,35,25};  
  138.         System.out.println(match(70,a,1));  
  139.         System.out.println(match(45,a,0));  
  140.         System.out.println(match(60,b,-1));  
  141.         System.out.println(match(55,b,-1));  
  142.           
  143.         int[][] scan=new int[][]{{7,17,117,1117},{8,18,118,1118},{9,19,119,1119}};  
  144.         System.out.println(vlookup(7,scan,3));  
  145.         System.out.println(hlookup(7,scan,3));  
  146.         System.out.println(lookup(35,a,b));  
  147.     }  
  148. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值