假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。
将如何实现这个方法呢,一种方法为:
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]"。
分享到:
相关推荐
2.可以把结构体中定义了零长度数组的地方 视为结构体的结尾,在它之后最好不要再定义任何字段 4.等价写法:typedef struct user_def{
结构体零长度数组的意义(深入)1
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样...使用起来非常方便,创建时,malloc一段结构体大小加上可变长数据长度的空间给它,可变长部分可按数组的方式访问,释放时,直接把整个结构体free掉就可以了。
空数组的长度为零。sz = size(A) 返回一个行向量,其元素是 A 的相应维度的长度。例如,如果 A 是一个 3×4 矩阵,则 size(A) 返回向量 [3 4]。如果 A 是表或时间表,则 size(A) 返回由表中的行数和变量数组成的二...
(2)对排好序的数组使用折半查找(使用递归和非递归两种形式分别实现)查找某一个int元素。 2、使用一维数组编码实现一个栈(Stack)类,要求提供以下操作:(1)boolean isEmpty():判断栈当前是否为空;(2)入栈...
例如长度高度或深度图的顶部,显示了一个仅在一个方向上延伸的一维数组,图的底部显示了一个在两个方向上延伸的二维数组,所以我们有行和列的二维数组。 在行和列的网格中显示其数组元素二维数组同时具有行索引和列...
ArrayList() 会使用长度为零的数组 ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量 add(Object o) 首次扩容为 10,再次扩容为上次...
描述 //function ... 如果数组长度为零或groupCount小于一,则返回一个空数组。 例子 const groupArrayElements = require ( './groupArrayElements' ) groupArrayElements ( [ 1 , 2 , 3 , 4 , 5 ] , 3 ) /
根据数组的长度自动填充位数,或明确传入要使用的位数。 使用安装 npm i digits --save 运行测试 npm test 用法 var digits = require ( 'digits' ) ; 应用程序接口 用指定number的零或备用character左填充给定...
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的...
n :要返回的数组的长度 fn :一个函数,它将返回一些内容以填充您的数组。 这是可选的; 它默认为身份功能。 fn参数将运行n次,并使用以下参数调用: i :此结果的数组索引 r :到目前为止的结果数组(这样您就...
(8)创建一个2行3列的零矩阵命名为z,将z的2行3列的位置值置成1。 (9)生成4*4的对角矩阵,以[1,2,3,4]为对角线,其他位置用0填充,命名为z1 。 (10)用0~8的数,创建成`3*3`的矩阵,命名为z2;用随机数,创建`4*4`...
数组概述 C# 数组从零开始建立索引,即数组索引从零开始。C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。 声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。...
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,位数不同类型也就不同,int64 != int32 切片: 切片就是一种简化版的动态数组,因为动态数组的长度不固定,所以切片的长度自然也...
因为数组的长度是固定的,因此在Go语言中很少直接使用数组 Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,其基于数组 数组的每个元素都被初始化为元素类型对应的零值 数组的长度位置出现的是“......
5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。 5.13 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否...
比如切片是一个三项的描述符,包含数据指针(数组内),长度,和容量;在这些项初始化前,切片为 nil 。 对于切片、映射和程道,make初始化内部数据结构,并准备要用的值。 记住 make() 只用于映射、切片和程道,不...
leetcode 答案 数组 Two Pointer ...不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 链接: 75-颜色分类 给定一个包含红色、白色和蓝色,一共 n 个元素的数组
Matlab 函数将数组填充到所需的新大小
//矩阵的行数,列数和非零元的个数 }TSMatrix; voidFind_TSMatrix(TSMatrix M, int m, int n, ElemType&e) //M为要查找的稀疏矩阵三元组存储,m为要查找的元素的行号,n为列号,e为查找后得到的值。 { for ( i=1 ;...