`
JAVA海洋
  • 浏览: 600790 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

使用零长度数组

阅读更多
假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。
将如何实现这个方法呢,一种方法为:
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]"。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics