假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。
将如何实现这个方法呢,一种方法为:
importjava.util.*;
publicclassZeroDemo1{
//filterinputarrayandthrowawayvalues
//thatarelessthanminvalorgreaterthan
//maxval
staticint[]filterData(intindata[],intminval,intmaxval){
//checkparametersforerrors
if(indata==null){
thrownewNullPointerException("indataisnull");
}
if(maxval<minval){
thrownewIllegalArgumentException("maxval<minval");
}
//countnumberofvalidvalues
//ininputarray
intvalidcnt=0;
for(intii=0;ii<indata.length;ii++){
if(indata[ii]>=minval&&indata[ii]<=maxval){
validcnt++;
}
}
//ifnovalidvalues,returnnull
if(validcnt==0){
returnnull;
}
//copyvalidvaluestonewarray
//andreturnit
intoutdata[]=newint[validcnt];
for(intii=0,j=0;ii<indata.length;ii++){
if(indata[ii]>=minval&&indata[ii]<=maxval){
outdata[j++]=indata[ii];
}
}
returnoutdata;
}
publicstaticvoidmain(Stringargs[]){
//setuptestarrayofintegers
intindata[]=newint[]{1,3,-17,8,59};
//filteroutvaluesnotintherange1-10
intoutdata1[]=filterData(indata,1,10);
for(intii=0;ii<outdata1.length;ii++){
System.out.println(outdata1[ii]);
}
//filteroutvaluesnot
//intherange100-200
intoutdata2[]=filterData(
indata,100,200);
for(intii=0;ii<outdata2.length;ii++){
System.out.println(outdata2[ii]);
}
}
}
filterData方法两次遍历input数组,第一次是计算有效数据的数目。根据此数据初始化一个新的数组,然后拷贝合法数据。如果没有有效的数据,方法返回null。
ZeroDemo1的执行结果为:
1
3
8
Exceptioninthread"main"
java.lang.NullPointerException
atZeroDemo1.main(ZeroDemo1.java:72)
这是个很简单的应用,第二次调用filterData时返回了null,程序抛出了异常。
对于无有效数据的情况,有一个更好的实现方法:
/*
if(validcnt==0){
returnnull;
}
*/
如果无有效的数据,我们可以分配一个零长度的数组:
intoutdata[]=newint[0];
这是一个绝对合法的java用法。
在ZeroDemo的例子中,如果validcnt会经常是0的话,即给定数据常常都是无效数据,你可以将程序片改为:
intoutdata[]=newint[validcnt];
if(validcnt==0){
returnoutdata;
}
这种用法等同于:
intoutdata[]=newint[]{};
这种用法同样是合法的,初始化一个零长度的数组。
一般情况下,返回一个null数组不是一个好的选择。当返回数组时,即使数组的长度为零,也会很大的改进你的算法。如果程序常常会返回零长度数组,为了提高效率,可以声明一个如下的静态的常数:
privatestaticfinalint[]ZERO_LENGTH_ARRAY=newint[0];
这个常数可以在所用的应用中所共用。
下面的例子,说明了零长度数组另外一个应用:
importjava.util.*;
publicclassZeroDemo2{
publicstaticvoidmain(Stringargs[]){
//setupArrayListandaddstringstoit
Liststringlist=newArrayList();
stringlist.add("string1");
stringlist.add("string2");
stringlist.add("string3");
//converttoStringarray
Stringout[]=(String[])stringlist.toArray(newString[0]);
for(intii=0;ii<out.length;ii++){
System.out.println(out[ii]);
}
}
}
ZeroDemo2程序的运行结果:
string1
string2
string3
程序创建了一个ArrayList对象,并加入三个字符串。然后程序调用toArray方法。在例子中,toArray方法的参数是"newString[0]"。
将如何实现这个方法呢,一种方法为:
importjava.util.*;
publicclassZeroDemo1{
//filterinputarrayandthrowawayvalues
//thatarelessthanminvalorgreaterthan
//maxval
staticint[]filterData(intindata[],intminval,intmaxval){
//checkparametersforerrors
if(indata==null){
thrownewNullPointerException("indataisnull");
}
if(maxval<minval){
thrownewIllegalArgumentException("maxval<minval");
}
//countnumberofvalidvalues
//ininputarray
intvalidcnt=0;
for(intii=0;ii<indata.length;ii++){
if(indata[ii]>=minval&&indata[ii]<=maxval){
validcnt++;
}
}
//ifnovalidvalues,returnnull
if(validcnt==0){
returnnull;
}
//copyvalidvaluestonewarray
//andreturnit
intoutdata[]=newint[validcnt];
for(intii=0,j=0;ii<indata.length;ii++){
if(indata[ii]>=minval&&indata[ii]<=maxval){
outdata[j++]=indata[ii];
}
}
returnoutdata;
}
publicstaticvoidmain(Stringargs[]){
//setuptestarrayofintegers
intindata[]=newint[]{1,3,-17,8,59};
//filteroutvaluesnotintherange1-10
intoutdata1[]=filterData(indata,1,10);
for(intii=0;ii<outdata1.length;ii++){
System.out.println(outdata1[ii]);
}
//filteroutvaluesnot
//intherange100-200
intoutdata2[]=filterData(
indata,100,200);
for(intii=0;ii<outdata2.length;ii++){
System.out.println(outdata2[ii]);
}
}
}
filterData方法两次遍历input数组,第一次是计算有效数据的数目。根据此数据初始化一个新的数组,然后拷贝合法数据。如果没有有效的数据,方法返回null。
ZeroDemo1的执行结果为:
1
3
8
Exceptioninthread"main"
java.lang.NullPointerException
atZeroDemo1.main(ZeroDemo1.java:72)
这是个很简单的应用,第二次调用filterData时返回了null,程序抛出了异常。
对于无有效数据的情况,有一个更好的实现方法:
/*
if(validcnt==0){
returnnull;
}
*/
如果无有效的数据,我们可以分配一个零长度的数组:
intoutdata[]=newint[0];
这是一个绝对合法的java用法。
在ZeroDemo的例子中,如果validcnt会经常是0的话,即给定数据常常都是无效数据,你可以将程序片改为:
intoutdata[]=newint[validcnt];
if(validcnt==0){
returnoutdata;
}
这种用法等同于:
intoutdata[]=newint[]{};
这种用法同样是合法的,初始化一个零长度的数组。
一般情况下,返回一个null数组不是一个好的选择。当返回数组时,即使数组的长度为零,也会很大的改进你的算法。如果程序常常会返回零长度数组,为了提高效率,可以声明一个如下的静态的常数:
privatestaticfinalint[]ZERO_LENGTH_ARRAY=newint[0];
这个常数可以在所用的应用中所共用。
下面的例子,说明了零长度数组另外一个应用:
importjava.util.*;
publicclassZeroDemo2{
publicstaticvoidmain(Stringargs[]){
//setupArrayListandaddstringstoit
Liststringlist=newArrayList();
stringlist.add("string1");
stringlist.add("string2");
stringlist.add("string3");
//converttoStringarray
Stringout[]=(String[])stringlist.toArray(newString[0]);
for(intii=0;ii<out.length;ii++){
System.out.println(out[ii]);
}
}
}
ZeroDemo2程序的运行结果:
string1
string2
string3
程序创建了一个ArrayList对象,并加入三个字符串。然后程序调用toArray方法。在例子中,toArray方法的参数是"newString[0]"。