(又一难题)----- 还是关于数组的循环的问题,请各位前辈帮帮我 -----

seamone 2009-11-26 06:25:40
是用SQL语句从数据库中获取的一个唯一参数中点的坐标,如下:

横坐标 纵坐标
403 100.01
403 110.02
403 115.03
403 123.04
403 126.05
405 177.07
405 182.08
405 189.09
406 245.10
406 288.11
406 290.12
406 561.13


我想实现如下功能如下,,

大循环1:横坐标403的5个数对应的纵坐标{100.01, 110.02, 115.03, 123.04, 126.05},内部循环减(规律如下)

110.02-100.01, 115.03-110.02, 123.04-115.03, 126.05-123.04 后又循环判断是否有重复,有则存入数组
115.03-100.01, 123.04-110.02, 126.05-115.03 后又循环判断是否有重复,有则存入数组
123.04-100.01, 126.05-110.02 后又循环判断是否有重复,有则存入数组
126.05-100.01 后又循环判断是否有重复,有则存入数组

大循环2:横坐标405的4个数对应的纵坐标{177.07, 182.08, 189.09},内部循环减(规律如下)

182.08-177.07, 189.09-182.08 后又循环判断是否有重复,有则存入数组
189.09-177.07 后又循环判断是否有重复,有则存入数组

大循环3:同上……


------------------------------------
之前发帖有与此类似问题,在此特别感谢liherun大哥(今天耽搁他不少时间,真的谢谢)与其他热心的大哥相助已经解决,再次感激各位!!这里开一新帖,又一新的循环让我又无法动弹了,希望大家不要嘲笑或者打击我,我学习的好吃力的。

我单独测试数组,想到方法了,但是无法从大局来完整写,因为我无法确定403、405、406等的数组的循环个数。而且我的想很局限的。
            int[] arr1 = { 1, 2, 5, 15, 25, 66 }; 
int k = 0;
int b = arr1.Length;
int c = 1;
for (int i = 0; i < b - 1; i++)
{
for (int j = 0; j < b - c; j++)
{
if (arr1[j + c] > arr1[j])
k = arr1[j + c] - arr1[j];

//k存入数组
}
c++;
}
...全文
432 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
seamone 2009-12-01
  • 打赏
  • 举报
回复
不知道等会又上不了线就麻烦了,或者请有路过的高手大哥顺便帮助帮助我的问题,感谢。
seamone 2009-12-01
  • 打赏
  • 举报
回复
liherun 大哥你好,我这几天网络出问题不好意思。请问最后你发的代码怎么调试呢?一直调试不成功,可能我的方法不对,请恕小弟愚钝,请liherun 大哥有空时候说一下,谢谢大哥了。
seamone 2009-12-01
  • 打赏
  • 举报
回复
经过测试达到目的,谢谢各位朋友们的热情帮助,
在这里特别非常感谢liherun 大哥。现在结贴。
liherun 2009-12-01
  • 打赏
  • 举报
回复
 private void button2_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("hengzuobiao");
dt.Columns.Add("zongzuobiao");
DataRow dr;
dr = dt.NewRow();
dr[0] = 403;
dr[1]=100.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 403;
dr[1] = 108.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 403;
dr[1] = 110.51;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 403;
dr[1] = 113.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 403;
dr[1] = 118.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 403;
dr[1] = 125.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 111.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 126.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 127.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 133.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 158.01;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 405;
dr[1] = 197.01;
dt.Rows.Add(dr);
jisuan(dt);
ArrayList al = result;
}
private void jisuan(DataTable dt)
{
if (dt == null)
return;
DataView dv = new DataView(dt);
dv.Sort = dt.Columns[0].ColumnName;
dt = dv.ToTable();
string henzuobiaozonghe = "";
ArrayList al = new ArrayList();
int henzuobiaocount = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
if (henzuobiaozonghe.IndexOf(dt.Rows[i][0].ToString()) < 0)
{
henzuobiaozonghe += dt.Rows[i][0].ToString() + ",";
al.Add(dt.Rows[i][0].ToString());
henzuobiaocount++;
}
}

int[] leng = new int[henzuobiaocount];
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < henzuobiaocount; j++)
{
if (al[j].ToString() == dt.Rows[i][0].ToString())
{
leng[j]++;
break;
}
}
}
getString(leng, dt);
}
//计算每一种横坐标的初始下标和总数量
private void getString(int[] leng, DataTable dt)
{
int canshu = 0;
for (int i = 0; i < leng.Length; i++)
{
Addal(canshu, leng[i], dt);
canshu += leng[i];
}
}
ArrayList result = new ArrayList();
//计算每一种横坐标的差

private void Addal(int chushixiabiao, int zongshu, DataTable dt)
{
ArrayList al;

for (int i = 0; i < zongshu; i++)
{
al = new ArrayList();
for (int j = 0; j < zongshu; j++)
{
if (j + i + 1 > zongshu - 1)
break;
al.Add(dt.Rows[j + chushixiabiao][0] + "," + (Double.Parse(dt.Rows[j + chushixiabiao][1].ToString()) - Double.Parse(dt.Rows[j + chushixiabiao + i + 1][1].ToString())).ToString());
}
getReault(al, result.Count);
}

}
private void getReault(ArrayList al, int resultchushi)
{
for (int i = 0; i < al.Count; i++)
{
for (int j = i + 1; j < al.Count; j++)
{
if (al[i] == null || al[j] == null)
break;
if (al[i].ToString().Split(',')[0] == al[j].ToString().Split(',')[0] && Math.Abs(double.Parse(al[i].ToString().Split(',')[1])) == Math.Abs(double.Parse(al[j].ToString().Split(',')[1])))
result.Add(al[i].ToString().Replace("-", ""));
}
}
int shuliang = 1;//重复的次数
//int shuliang = 2;//出现的次数

for (int i = resultchushi; i < result.Count; i++)
{
for (int j = i + 1; j < result.Count; j++)
{
if (result[i].Equals(result[j]))
{
shuliang++;
result.RemoveAt(j);
}
}
result[i] = result[i].ToString() + "," + shuliang.ToString();
shuliang = 1;//重复的次数
//int shuliang = 2;//出现的次数
}

}
zhoujk 2009-11-28
  • 打赏
  • 举报
回复
横坐标 纵坐标
403 100.01
403 110.02
403 115.03
403 123.04
403 126.05
405 177.07
405 182.08
405 189.09
406 245.10
406 288.11
406 290.12
406 561.13
返回上述几个点到坐标原点的距离,并且将其中距离坐标原点最近的点和最远的点的结果存储(只需一个循环)。
返回最近点与最远点的XY轴的平均数(x,y),是不是你要的答案?
liherun 2009-11-28
  • 打赏
  • 举报
回复
饿
liherun 2009-11-28
  • 打赏
  • 举报
回复
我给你的那个方法好用,dt就俩列,第一列横坐标,第二列纵坐标
你调试一下
seamone 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 zhoujk 的回复:]
横坐标 纵坐标
403    100.01
403    110.02
403    115.03
403    123.04
403    126.05
405    177.07
405    182.08
405    189.09
406    245.10
406    288.11
406    290.12
406    561.13
返回上述几个点到坐标原点的距离,并且将其中距离坐标原点最近的点和最远的点的结果存储(只需一个循环)。
返回最近点与最远点的XY轴的平均数(x,y),是不是你要的答案?
[/Quote]
终于上来了,又是好大的雪。
不是到坐标原点的距离,而是点与点之间,找是否有距离相等的数字,找到周期性。我不知道这样说你明白吗?我如果有表达不清楚,请看前面有例子最能说明,希望你能帮助小弟?谢谢!
liherun 2009-11-27
  • 打赏
  • 举报
回复
调用

DataTable dt=…………//查出来的数据
jisuan(dt);
ArrayList al=getReault();
liherun 2009-11-27
  • 打赏
  • 举报
回复
//得到横坐标的数量以及每一种横坐标的数量
private void jisuan(DataTable dt)
{
if (dt == null)
return ;
DataView dv = new DataView(dt);
dv.Sort = dt.Columns[0].ColumnName;
dt = dv.ToTable();
string henzuobiaozonghe = "";
ArrayList al = new ArrayList();
int henzuobiaocount = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
if (henzuobiaozonghe.IndexOf(dt.Rows[i][0].ToString()) < 0)
{
henzuobiaozonghe += dt.Rows[i][0].ToString() + ",";
al.Add(dt.Rows[i][0].ToString());
henzuobiaocount++;
}
}

int[] leng = new int[henzuobiaocount];
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < henzuobiaocount; j++)
{
if (al[j].ToString() == dt.Rows[i][0].ToString())
{
leng[j]++;
break;
}
}
}
getString(leng, dt);
}
//计算每一种横坐标的初始下标和总数量
private void getString(int[] leng, DataTable dt)
{
int canshu = 0;
for (int i = 0; i < leng.Length; i++)
{
Addal(canshu, leng[i], dt);
canshu += leng[i];
}
}
//计算每一种很坐标的差
ArrayList al = new ArrayList();
private void Addal(int chushixiabiao, int zongshu, DataTable dt)
{
for (int i = chushixiabiao; i < chushixiabiao + zongshu; i++)
{
for (int j = i + 1; j < chushixiabiao + zongshu; j++)
{
al.Add(dt.Rows[i][0] + ","+(Int64.Parse(dt.Rows[i][1].ToString()) - Int64.Parse(dt.Rows[j][1].ToString())).ToString());
}
}

}
private ArrayList getReault()
{
ArrayList result = new ArrayList();
for (int i = 0; i < al.Count; i++)
{
for (int j = i + 1; j < al.Count; j++)
{
if (al[i] == null || al[j] == null)
break;
if (al[i].ToString().Split(',')[0] == al[j].ToString().Split(',')[0] && Math.Abs(int.Parse(al[i].ToString().Split(',')[1])) == Math.Abs(int.Parse(al[j].ToString().Split(',')[1])))
result.Add(al[i].ToString().Replace("-", ""));
}
}
for (int i = 0; i < result.Count; i++)
{
for (int j = i + 1; j < result.Count; j++)
{
if (result[i].Equals(result[j]))
{
result.RemoveAt(j);
}
}
}
return result;
}


调用方法

DataTable dt=…………//查出来的数据
jisuan(dt);
getReault();
seamone 2009-11-27
  • 打赏
  • 举报
回复
请各位大哥有时间的话帮帮小弟,真心的感谢你们。我都快写疯了
liherun 2009-11-27
  • 打赏
  • 举报
回复
这个没这么容易吧,
得得到横坐标的数量
每一种横坐标的数量
循环出所有差值
比较差值
十八道胡同 2009-11-27
  • 打赏
  • 举报
回复
用一个变量来记录index差 1~length-1
liherun 2009-11-27
  • 打赏
  • 举报
回复
Linux7985老大写的那个是比较相邻两个数的,要比较所有的和冒泡一样,得用嵌套循环
seamone 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 linux7985 的回复:]
引用 8 楼 liherun 的回复:
to:4楼  不用双循环怎么判断他们的差值是否有相同的,没有想出来,请指教

二次循环和嵌套循环应该不一样吧,
[/Quote]
Linux7985 大哥,你说的我还是没有写出,等你有空能帮帮我好吗,谢谢。
Neil198 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liherun 的回复:]
[/Quote]
山寨版的一支熊猫?
十八道胡同 2009-11-27
  • 打赏
  • 举报
回复
根据你描述的循环来看,首先看下标差1的是否有重复的,然后看差2的是否有重复的,
这个差几(1- arr.length-1)可以用一个变量表示,这里假设是k,初始化为1,最大值是lenth-1
用单层循环来找,当差值是k的时候 数组的22差值是否有重复的,
依次。。

思路很清晰了啊?!
seamone 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liherun 的回复:]
to:seamone
这个和昨天那个一样的吧
[/Quote]
哈哈,liherun大哥来啦,是的,和昨天的基本一样,只是这个减运算成为这样了,

110.02-100.01, 115.03-110.02, 123.04-115.03, 126.05-123.04 后又循环判断是否有重复,有则存入数组
115.03-100.01, 123.04-110.02, 126.05-115.03 后又循环判断是否有重复,有则存入数组
123.04-100.01, 126.05-110.02 后又循环判断是否有重复,有则存入数组
126.05-100.01 后又循环判断是否有重复,有则存入数组


我在你昨天给我的代码上一直研究加不上,唉:(
liherun 2009-11-27
  • 打赏
  • 举报
回复
谢谢老大
liherun 2009-11-27
  • 打赏
  • 举报
回复
哦了,嘿嘿,新手
加载更多回复(40)

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧