注:
1.第一部分是昨天写的,未深入探讨Arraylist机制(虽然现在理解的也不多);
2.第二部分是今天在做完水准网间接平差后的操作。因为去重在网上没找到合适的方案,于是自己做了实验,简单总结了下Arraylist的去重操作。嗯,还是稍微有点价值的(个人认为)。
第一部分:
平差时遇到了多条线路观测同一个待定高程点的问题,那么此时,待定点个数的确定,就得考虑下了。
读取数据时,采用结构体存点,然后再添加到ArrayList中存储。
存储时,把每个观测值的起点终点都记录了下来,而待定高程点点名则要从里面提取出来。
//第一步,把所有待定高程点的起点、终点点名存到pointlistDaiDing中
for (int i = 0; i < Num.levelRoute; i++) {
PointUnKnowH pointUnKnowH_read = (PointUnKnowH)pointlistUnKnow[i];
pointlistDaiDing.Add(pointUnKnowH_read.startPoint);
pointlistDaiDing.Add(pointUnKnowH_read.endPoint);
}
接下来,去除重复数据:
//删除重复数据
for (int i = 0; i < pointlistDaiDing.Count; i++)
{
for (int j = i + 1; j < pointlistDaiDing.Count; j++)
{
if (pointlistDaiDing[i].Equals(pointlistDaiDing[j]))
{
pointlistDaiDing.RemoveAt(j);
if (i > 0)
{
i--;
}
}
}
}
第二部分:
以上内容是昨天写的,保留了草稿,那会儿确实是很纠结的。
但是,刚刚,我做出来那个水准网间接平差的了。
很高兴啊。
遇到的很考验算法的知识点是:ArrayList去重
研究了下,总结了两种情况:
1.两项为完全相同
//首先构造数据如下:
for (int i = 0; i < 3; i++) {
test a;
a.name = "first";
a.h = 100;
pointlistNameH.Add(a);
test a1;
a1.name = "second";
a1.h = 200;
pointlistNameH.Add(a1);
test a3;
a3.name = "Third";
a3.h = 100.5;
pointlistNameH.Add(a3);
}
//然后去重,也就是 删除重复数据
for (int i = 0; i < pointlistNameH.Count; i++)
{
for (int j = i + 1; j < pointlistNameH.Count; j++)
{
if (pointlistNameH[i].Equals(pointlistNameH[j]))
{
pointlistNameH.RemoveAt(j);
if (i > 0)
{
i--;
}
}
}
}
情况一运行效果如图
2.两项只有部分字段相同
此时进行去重操作时应采用相同的字段作为判断条件
//首先,构造部分字段相同的数据
test a;
a.name = "first";
a.h = 100;
pointlistNameH.Add(a);
test a1;
a1.name = "second";
a1.h = 200;
pointlistNameH.Add(a1);
test a3;
a3.name = "Third";
a3.h = 100.5;
pointlistNameH.Add(a3);
test aa;
a.name = "first";
a.h = 100.5;
pointlistNameH.Add(a);
test aa1;
a1.name = "second";
a1.h = 200.3;
pointlistNameH.Add(a1);
test aa3;
a3.name = "Third";
a3.h = 101;
pointlistNameH.Add(a3);
for(int i=0;i<pointlistNameH.Count;i++){
test test_read = (test)pointlistNameH[i];
//先输出下未去重的数据 Console.WriteLine("Name:"+test_read.name+"\tH:"+test_read.h);
}
for (int i = 0; i < pointlistNameH.Count; i++)
{
test test_read = (test)pointlistNameH[i];
for (int j = i + 1; j < pointlistNameH.Count; j++)
{
test test_read2 = (test)pointlistNameH[j];
if (test_read.name == test_read2.name)
{
pointlistNameH.RemoveAt(j);
if (i > 0)
{
i--;
}
}
}
}
//输出下去重操作完成后的数据
Console.WriteLine("-------------------------------------------------------------");
for (int i = 0; i < pointlistNameH.Count; i++)
{
test test_read = (test)pointlistNameH[i];
Console.WriteLine("Name:" + test_read.name + "\tH:" + test_read.h);
}
情况二运行效果如图
后注:
先前叙述时为了突出问题解决方案,未做具体讲述,在后面补充上。
首先,要声明个结构体
struct test {
public string name;
public double h;
}
然后,考虑到要把点位信息进行存储,于是声明了Arraylist动态数组,以方便后续操作。
ArrayList pointlistNameH = new ArrayList();
这里需要注意的是,使用 Arraylist需要添加引用如下:
using System.Collections;
然后,就是上面的两种情况的构造了。
放个Github下载链接?
算了,还没用好呢,改天再来分享(chui)经验(niu)吧。