Esri geometry api java 学习 数据结构 (5) 对属性流(AttributeStream)数组的控制

上节说道,多顶点形状的每一种属性都以属性流AttributeStream的形式保存,今天就来看一下AttributeStream是如何实现对属性的控制的(以double类型的数组AttributeStreamOfDbl为例)。

对数组的控制主要靠两点:

数组的长度:private int m_size;

和数组的内容:private double[] m_buffer = null;

从这两点我们吧AttributeStream的基础操作分为两类:对长度的控制和对内容的修改。

1.控制长度

函数名功能描述核心
reserve控制数组长度通过输入长度使数组处于最长状态System.arraycopy(m_buffer, 0, buf, 0, m_size);
capacity获取数组长度简单读取长度m_buffer.length
resize控制数组长度控制数组长度,在修改操作前几乎都要使用

新值小时改动小于25%修改buffer,否则不改;

新值大时 1.大于64位膨胀25%;

                2.小于64膨胀两倍。

 

2.控制内容

函数名功能描述核心
read简单读一条简单读一条m_buffer[offset]
write简单覆盖一条简单覆盖一条m_buffer[offset] = value;
add简单加一条简单加一条,使用前用resize调整长度m_buffer[m_size - 1] = v;
readAsInt...read+强转read+强转(int) read(offset)
writeAsIntwrite+强转write+强转write(offset, (double) d);

 

3.复杂一点的操作

函数名功能描述核心
AttributeStreamOfDbl初始化使用长度、长度+默认值、其他属性流、其他属性流+长度限制 做初始化

先初始化长度,再添加内容

System.arraycopy();

Arrays.fill(m_buffer, 0, size, defaultValue);

other.m_buffer.clone();

equals

判断相等

1.强转格式一致;

2.长度一致且不超限;

3.内容一致。

 
addRange

后加

1.调整大小resize;

2.复制数组arraycopy。

 
insertRange

中插

1.调整大小resize;

2.后 = 中;

3.中 = 新。

 
insertAttributes语义中插中插*语义包含属性数 
eraseRange删除后 = 中 (后没删) 
readRange正常读。。。  

 

 

总结一下本节给我们控制数组的教训:

1.给长度以充分的重视,要给它写一全套的增、改、查、置零的方法,写的要简单易于执行。这里的长度控制函数超级朴实:resize(int newSize)给它一个长度让它内部给你分配操作。以后写类似程序时值得学习。

2.每次对内容进行改动时先要调用长度函数。

3.给数组预留的空间。还是指resize(int newSize)函数预留的策略,可以有效对数组操作,也可以提高运行速度用一定的空间复杂换取时间复杂。

 

 

 

附resize的程序:

public void resize(int newSize) {
		if (m_bLockedInSize)
			throw new GeometryException(
					"invalid call. Attribute Stream is locked and cannot be resized.");

		if (newSize <= m_size) {
			if ((newSize * 5) / 4 < m_buffer.length) {// decrease when the 25%
				// margin is exceeded
				double[] newBuffer = new double[newSize];
				System.arraycopy(m_buffer, 0, newBuffer, 0, newSize);
				m_buffer = newBuffer;
			}
			m_size = newSize;
		} else {
			if (newSize > m_buffer.length) {
				int sz = (newSize < 64) ? Math.max(newSize * 2, 4)
						: (newSize * 5) / 4;
				double[] newBuffer = new double[sz];
				System.arraycopy(m_buffer, 0, newBuffer, 0, m_size);
				m_buffer = newBuffer;
			}

			m_size = newSize;
		}
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值