假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。
将如何实现这个方法呢,一种方法为:
import java.util.*;
public class ZeroDemo1 {
// filter input array and throw away values
// that are less than minval or greater than
// maxval
static int[] filterData(int indata[], int minval, int maxval) {
// check parameters for errors
if (indata == null) {
throw new NullPointerException("indata is null");
}
if (maxval < minval) {
throw new IllegalArgumentException("maxval < minval");
}
// count number of valid values
// in input array
int validcnt = 0;
for (int ii = 0; ii < indata.length; ii++) {
if (indata[ii] >= minval && indata[ii]<= maxval) {
validcnt++;
}
}
// if no valid values, return null
if (validcnt == 0) {
return null;
}
// copy valid values to new array
// and return it
int outdata[] = new int[validcnt];
for (int ii = 0, j = 0; ii < indata.length; ii++) {
if (indata[ii] >= minval && indata[ii] <= maxval) {
outdata[j++] = indata[ii];
}
}
return outdata;
}
public static void main(String args[]) {
// set up test array of integers
int indata[] = new int[]{1, 3, -17, 8, 59};
// filter out values not in the range 1-10
int outdata1[] = filterData(indata, 1, 10);
for (int ii = 0; ii < outdata1.length; ii++) {
System.out.println(outdata1[ii]);
}
// filter out values not
// in the range 100-200
int outdata2[] = filterData(
indata, 100, 200);
for (int ii = 0; ii < outdata2.length; ii++) {
System.out.println(outdata2[ii]);
}
}
}
filterData方法两次遍历input数组,第一次是计算有效数据的数目。根据此数据初始化一个新的数组,然后拷贝合法数据。如果没有有效的数据,方法返回null。
ZeroDemo1的执行结果为:
1
3
8
Exception in thread "main"
java.lang.NullPointerException
at ZeroDemo1.main(ZeroDemo1.java:72)
这是个很简单的应用,第二次调用filterData时返回了null,程序抛出了异常。
对于无有效数据的情况,有一个更好的实现方法:
/*
if (validcnt == 0) {
return null;
}
*/
如果无有效的数据,我们可以分配一个零长度的数组:
int outdata[] = new int[0];
这是一个绝对合法的java用法。
在ZeroDemo的例子中,如果validcnt会经常是0的话,即给定数据常常都是无效数据,你可以将程序片改为:
int outdata[] = new int[validcnt];
if (validcnt == 0) {
return outdata;
}
这种用法等同于:
int outdata[] = new int[]{};
这种用法同样是合法的,初始化一个零长度的数组。
一般情况下,返回一个null数组不是一个好的选择。当返回数组时,即使数组的长度为零,也会很大的改进你的算法。如果程序常常会返回零长度数组,为了提高效率,可以声明一个如下的静态的常数:
private static final int[] ZERO_LENGTH_ARRAY = new int[0];
这个常数可以在所用的应用中所共用。
下面的例子,说明了零长度数组另外一个应用:
import java.util.*;
public class ZeroDemo2 {
public static void main(String args[]) {
// set up ArrayList and add strings to it
List stringlist = new ArrayList();
stringlist.add("string 1");
stringlist.add("string 2");
stringlist.add("string 3");
// convert to String array
String out[] = (String[])stringlist.toArray(new String[0]);
for (int ii = 0; ii < out.length; ii++) {
System.out.println(out[ii]);
}
}
}
ZeroDemo2程序的运行结果:
string 1
string 2
string 3
程序创建了一个ArrayList对象,并加入三个字符串。然后程序调用toArray方法。在例子中,toArray方法的参数是"new String[0]"。
本文地址:http://com.8s8s.com/it/it15983.htm