注册 登录
编程论坛 ASP技术论坛

求“出现第一个数到出现第二个数间的间隔数和其最大的间隔数”

anjincheng 发布于 2009-11-13 15:24, 1572 次点击
各位老师:

下表是查询结果表,如何获取“类型”中第一个“高”与第二个“高”、第二个“高”与第三个“高”......之间的间隔数?最大的间隔是多少??

(以下表为例:第一个“高”与第二个“高”间距为 2;第二个“高”与第三个“高”的间距为 1;第三个“高”与第四个“高”的间距为 3;第四......;它们之间最大的间距是第三个“高”与第四个“高”的间距,间距为 3);请问各位老师,怎么实现?感谢!!非常急!先谢了!!

序号    类型
1        高
2      
3      
4        高
5      
6        高
7     
8     
9      
10       高
11   
12       高
13       高
14     
15     
…………….   


16 回复
#2
yms1232009-11-13 19:36
第一步,循环遍历所有得出一共有几个高,然后创建一个数组这个数组的大小就是高的个数
第二部,继续循环遍历遇到一个,用一个临时变量记录间距,遇到一个高将当前临时变量存入数组,然后清空临时变量继续自增,得到所有间隔数
第三步,将间隔数数组使用冒泡排序法排序得到最大间隔数。
#3
yms1232009-11-13 19:39
VBScript好像没有ArrayList对象(动态集合对象),如果用ArrayList两个循环就可以搞定。
#4
anjincheng2009-11-13 19:51
如果用ArrayList两个循环怎么写!是否可以给些代码?感谢!!
#5
anjincheng2009-11-14 09:31
自己顶一下!
#6
anjincheng2009-11-14 09:58
<%
id="4-1,6-4,10-6,12-10,13-12,...."  ’第二个高的ID-第二个高的ID;第三个高的ID-第二个高的ID.......
‘ID="3,2,4,2,1......"‘怎么获取??

    Public Function max(strarr,outtype)
      Dim strsplit,tempmin,tempmax,i
      strsplit = split(id,",")
      tempmin = strsplit(0)
      tempmax = strsplit(0)
    For i=0 to ubound(strsplit)
    If strsplit(i)<tempmin then tempmin=strsplit(i)
    If strsplit(i)>tempmax then tempmax=strsplit(i)
  Next
    If outtype=1 then
    max=tempmax
  Else
    max=tempmin
  End if
  End Function
%>
如何获取ID的这个数组?如果能这样获取,用上面的代码应该就可以实现,但这数组不晓得怎么获取!!

麻烦各位老师帮帮忙了!!
#7
yms1232009-11-14 18:39
using System;
using System.Collections;
using
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace TempApplication91114
{
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此处放置用户代码以初始化页面
            ArrayList Arl=new ArrayList();//ArrayList对象
            string[][] Ary=new string[30][];//二维数组
            //生成数据
            for(int r=0;r<Ary.Length;r++)
            {
                Ary[r]=new string[2];
                //随机生成高
                switch(r)
                {
                    case 1:
                        Ary[r][1]="高";
                    break;
                    case 4:
                        Ary[r][1]="高";
                    break;
                    case 6:
                        Ary[r][1]="高";
                    break;
                    case 10:
                        Ary[r][1]="高";
                    break;
                    case 12:
                        Ary[r][1]="高";
                    break;
                    case 13:
                        Ary[r][1]="高";
                    break;
                    case 20:
                        Ary[r][1]="高";
                    break;
                    case 23:
                        Ary[r][1]="高";
                    break;
                    case 25:
                        Ary[r][1]="高";
                    break;
                    case 28:
                        Ary[r][1]="高";
                    break;
                    case 30:
                        Ary[r][1]="高";
                    break;               
                    default:
                        Ary[r][1]="";
                    break;               
                }
                Ary[r][0]=Convert.ToString(r);
            }
            //显示生成的数据
            Response.Write("<TABLE>");
            for(int vr=0;vr<Ary.Length;vr++)
            {
                Response.Write("<tr>");
                for(int vc=0;vc<Ary[vr].Length;vc++)
                {
                    Response.Write("<td>"+Ary[vr][vc]+"&nbsp;&nbsp;&nbsp;</td>");
                }
                Response.Write("</tr>");
            }
            Response.Write("</table>");
            int j=0;
            for(int cr=0;cr<Ary.Length;cr++)
            {
                if(Ary[cr][1]=="高")
                {
                    Arl.Add(j-1);
                    j=0;
                }
                j++;
            }
            Response.Write("排序前===========<BR>");
            for(int t=0;t<Arl.Count;t++)
            {
                Response.Write(Arl[t]+"<BR>");
            }
            Response.Write("==================<BR>");

            //冒泡排序法
            //第一个数跟最后一个比较大小后替换
            for(int i=0;i<Arl.Count;i++)
            {
                for(j=Arl.Count-1;j>i;j--)
                {
                    if(int.Parse(Arl[j].ToString())<int.Parse(Arl[i].ToString()))
                    {
                        int temp=int.Parse(Arl[j].ToString());
                        Arl[j]=Arl[i];
                        Arl[i]=Convert.ToString(temp);
                    }
                }
            }
            Response.Write("=======排序后<BR>");
            for(int t=0;t<Arl.Count;t++)
            {
                Response.Write(Arl[t]+"<BR>");
            }
        }

        #region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 该调用是 Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
}
#8
anjincheng2009-11-14 18:54
非常感谢老师!
#9
anjincheng2009-11-15 13:41
老师:
CStr(num) 可以获取最大间隔数;
CStr(i)  可以获取倒数第一个“高”到最后一条信息的间隔数
最大间隔数、倒数第一个“高”到最后一条信息的间隔数都实现了,现在就要只需实现倒数第一个“高”到倒数第二个“高”的间隔数了,感谢老师再看看怎么修改?
<%
dim isgao
i = 0
num = 0
isgao = true
do while not rs.eof
    if rs("类型") = "高" then
        isgao = false
    end if
    if isgao then
        i = i + 1
    else
        if i > num then
            num = i
        end if
        i = 0
        isgao = true
    end if
    rs.movenext
loop
response.write "最大间隔为" & CStr(num)
response.write "倒数第一个高到最后一条信息的间隔为" & CStr(i)
response.write "倒数第一个高到倒数第二个高的间隔为" & ......
%>
#10
yms1232009-11-15 15:15
如果你是获得所有间隔数存入数组,取倒数第二个不就是数组的倒数第二个元素吗?
#11
anjincheng2009-11-15 15:32
是呀!但倒数第二个元素我不知道怎么取!尝试了很多,但都不成功!
#12
yms1232009-11-15 17:04
你的数据都是存在数据库?表名是什么?那个表就两个字段?
#13
anjincheng2009-11-15 17:40
数据是存在数据库里的,表名是SG;字段有四:ID  GAO  ZHONG  AI
#14
yms1232009-11-15 17:58
序号按照ID排的?
#15
anjincheng2009-11-15 18:06
是的!
#16
yms1232009-11-15 18:50


Dim rs,conn,i,j,t,count
'声明变量rs为ADODB.RecordSet对象,conn为ADODB.Connection对象
'i,j,t为循环临时变量,count为记录高的数量
Dim Ary()'声明数组记录高的间距
'打开数据库
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.Open "select * from SG Order By ID ASC",conn,1,3'序号在数据库升序排列
count=0'初始化高的数量
'第一次循环统计高的数量
Do Until rs.EOF
   if rs("GAO")="高" Then
      count=count+1
   End IF
   rs.MoveNext
Loop
rs.MoveFrist'记录集移动到开头以备下一次循环
ReDim Ary(count)'重定义数组大小为高的数量
count=0'初始化高的数量
t=0'初始化变量t用于记录间距
'第二次循环将间距存入数组
Do Until rs.EOF
   if rs("GAO")="高" Then'如果为高
      Ary(count)=t'存入间距到数组
      t=0'记录变量清0继续记录
      count=count+1'数组下标变量自增
   End IF
   t=t+1
   rs.MoveNext
Loop
'开始冒泡排序代码(原理跟我之前写的都差不多只不过是翻译为VBScript的代码,不解释了)
For i=0 To count
    t=i+1
    For j=count To t Step -1
        IF Ary(j)<Ary(i) Then
           t=Ary(j)
           Ary(j)=Ary(i)
           Ary(i)=t
        End IF
    Next
Next
'显示排序后的结果
For i=0 To count
    Response.Write "排序后的数组<BR>"
    Response.Write Ary(i)&"<BR>"
Next
rs.Close
Set rs=Nothing
conn.Close
Set conn=Nothing
将我前面发的那段C#的代码写成VBScript的。
这时倒数第二个间距就是
Response.Write "倒数第二个间距"&Ary(count-1)
另外conn的打开数据库代码省略了,那个你应该会写吧。

[ 本帖最后由 yms123 于 2009-11-15 18:52 编辑 ]
#17
anjincheng2009-11-15 21:52
太感谢了老师!感谢!!
1