是不是程序代码太长了呀?程序爱好者应该对长的程序来劲才对呀!各位爱好者把这段程序拷下来试一下,再帮我解释一下其中的remove方法好吗?太感谢了哦!一定给分的呀!

解决方案 »

  1.   

    你如果学过数据结构,应该记得用数组下标实现链表,这里一样的
    先注意这一点,nsquares总比数组有效下标大1,比如nsquares为7的时候,数组中存储的有效的矩形为squares[0-6],你看,add中就是这样的,先存,再++ public void add(int x,int y)
     {
             if(nsquares<MAXSQUARE)
             {
       squares[nsquares]=new Point(x,y);
       nsquares++;
       repaint();
             }
     }
    然后就不难解释remove了
    public void remove(int n)
    {
                 if(n<0 || n>MAXSQUARE)
                        return;
                 nsquares--;
                 squares[n]=squares[nsquares];
         repaint();
    }首先前两行检测n的范围合法性
    然后,让矩形总数减少一个
    比如,原来nsquares=7,squares[0-6]存着当前7个矩形
    你要删除第5个,既 n = 5nsquares--; //nsquares = 6
    squares[5] = squares[6]; //把最后一个矩形存在square[5]这个位置,抹掉
    原来的squares[5],这时squares[6]就没用了,我们可以用squares[5]来存那个矩形
    结果仍然保持了nsquares和squares[]的有效下标大1关系
    nsquares=6,squares[0-5]存着当前7个矩形understand?
    再不明白,回去看看数据结构或者发短信to me
      

  2.   

    sorry, my Chinese input method is a pile of shit, it does not work again! So I have to input in English.
    Forget to tell you that, in your remove() method, repaint() method automatically invalidates all the images on your panel, and redraw your required components with a call to every components' paintComponent() method. So it's that easy.
      

  3.   

    In this case, your panel's paintComponent() method is called by itsself with a repaint(), and in your panel's paintComponent(), you used a for-loop to redraw all the rectangles.
      

  4.   

    非常感谢小丹尼网友的热情解答!!
    但是如果将上面的调用remove的程序段改成这样:
    public void mouseClicked(MouseEvent evt)
    {
    int x=evt.getX();
            int y=evt.getY();
            current=find(x,y);
            if(current>=0 && evt.getClickCount()>=2)
            {
    System.out.println(current);
                    //remove(current);
            }
    }
    如果将各个小矩形画好后,再双击这个小矩形的话,打印出的current值是0-9之间(如果10个小矩形都画好的话),也就是说在调用remove方法的时候,方法参数n的值也是0-9之间。
    那么我们假设要擦除第一个矩形,那么它n的值是0,那么在调用squares[n]=squares[nsquares]时候,就造成了
    squares[0]=squares[0]了,我想如果传进去的值是1-10之间,那么上面这位网友小丹尼的分析是对的,可是现在传进去的值是0-9啊!我就是在这里看不懂啊!!!这应该怎么来解释呢?
      

  5.   

    你还是没注意,即决定作用的是nsquares,
    造成squares[0]=squares[0]的情况只有一种
    n=0, nsquares在remove中 nsquares-- 变成为0
    也就是说,你是最后一个删掉squares[0],
    所以squares[0]要保存你刚双击删掉的squares[0],
    虽然这步没用,但是这步保持了整个算法的逻辑,
    这没有问题,而且很正确!然后你的nsquares变为0,
    限制squares[]里所有的东西就都不能使用了其实,你刚才做的一步看起来和运行时squares[0]=squares[0]都是多余的,
    但是逻辑上,他就是这样的
    这是一个很简单的数组模拟链表问题,看看数据结构吧,记住
    ======数据结构是计算机最核心的课目======
    ======The study of data structures is core to a computer science curriculum.=========             --------  Pacific 大学 William Ford & William Topp 语
      

  6.   

    太感谢小丹尼网友的解答了,是不是真正起决定作用的是nsquares变量对把?虽然在一个矩形的时候是squares[0]=squares[0],可是现在nsquares已经为零了,在paintComponent方法中根本不会进入for循环,只是简单的重画一下panel,所以把矩形删除了,这样理解对吗?
      

  7.   

    我觉得国内比较好的可能是南京大学陈本林的 数据结构
    清华有 C++ 描述版的一本,很不错,但是我看的时候,那本书很新,错误太多,必须有老师指点,现在该第二或第三版了吧,不知道怎么样了
    清华出的英文影印版的 Data Structures with C++ 很不错,很有名的,
    国外原价75美元,国内只54人民币!!!是我最喜欢的数据结构的书之一,作者Pacific University 的 William Ford 和 William Topp.
    如果你觉得英文看起来累,又打听不到清华那本书现在质量如何,就看看南大的吧,只可惜是Pascal版的,看起来罗索一些,不过内容是很棒