【问题标题】:My treeset seems to have a size value of 1, where it should be undefined我的树集似乎有一个大小值 1,它应该是未定义的
【发布时间】:2014-06-03 17:24:33
【问题描述】:

出于某种原因,我的列表只允许一个元素。当我删除元素时,它允许创建另一个元素,但我不能同时拥有两个圆圈。

这是小程序:

import java.applet.Applet;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Iterator;import java.util.Random;import java.util.Set;import java.util.TreeSet; import javax.swing.Timer;
public class Game extends Applet implements ActionListener{
    int b_width=500, b_height=500;
    int counter=0;
    Random gen=new Random(); Timer T; Set circles;

    public void init() {
        setSize(b_width, b_height); circles = new TreeSet(); 
    }
    public void circleConstr(){
        Circle cl=new Circle(b_width,(int)(gen.nextDouble()*b_height), gen.nextInt()%190, -1);
        circles.add(cl);
        Circle cr=new Circle(0, (int)(gen.nextDouble()*b_height), gen.nextInt()%190, 1);
        circles.add(cr);
    }

所以^^^它应该做了两个圆圈,但它只做了一个。

    public void circleMover(Set circles){
        Iterator<Circle> i=circles.iterator();
        while(i.hasNext()){
           Circle c=i.next();c.move();
           if(c._x>b_width+b_width/5||c._x<b_width/5||c._y>b_height+b_height/5||c._y<-b_height/5){i.remove();}
        }
    }
    public void paint(Graphics g){
        Iterator<Circle> i=circles.iterator();
        while(i.hasNext()){
            i.next().paint(g);
        } 
    }
    public void start(){    
       T = new Timer(100, this); //calls actionpreformed every .01 seconds(10 miliseconds)
       T.start(); //starts timer   
    }  

上面是计时器和画家

    @Override
    public void actionPerformed(ActionEvent e){
        if(counter%5==0){
            circleConstr();    
        }

另外在这里 ^^^^,它应该每 0.5 秒创建一个新圈,而是等到第一个圈被杀死。

        counter++;
        circleMover(circles);
        repaint();
    }
}

这里是circle类:

import java.awt.Color;import java.awt.Graphics;import      java.util.Random;

public class Circle implements Comparable {
    int _x, _y, _yb, _sp, multiplier; double _m,  _radiusRandom gen=new Random();
    int r=(int)(gen.nextDouble()*255), b=(int)(gen.nextDouble()*255), g=(int)(gen.nextDouble()*255);
    public Circle (int x, int y, int range, int multiplier){
        _x=x;_y=y;
        _radius=(int)(gen.nextDouble()*range); if(_radius<0){_radius*=-1;}
        _m=gen.nextDouble()+gen.nextInt()%2+.5;_sp=(int)(gen.nextDouble()*7)+1;_sp*=multiplier;
    }
    public void paint(Graphics h){
        Color color= new Color (r, b, g); 
        h.setColor(color);
        h.fillOval(_x, _y, (int)_radius, (int) _radius);
    }
    public void move(){
        _x+=_sp; _y=(int)(_m*_x+_yb);
    }

    @Override
    public int compareTo(Object t) {
        return 0;
    }
}

【问题讨论】:

    标签: java applet iterator set treeset


    【解决方案1】:

    Set 将不允许多个元素与 equal 进行比较。您对TreeSet 的使用将依赖于调用compareTo

    [A] TreeSet 实例使用它的 compareTo(或比较)方法执行所有元素比较

    您确实在Circle 中定义了compareTo。但是,您的compareTo 方法总是返回0,因此所有您的Circle 对象将相互比较,并且只有一个将进入您的TreeSet。 p>

    您需要正确定义您的 compareTo 方法。

    此外,您可能希望在TreeSet 类上使用泛型并在Circle 中实现Comparable 的泛型形式,例如:

    Set<Circle> circles;
    

    circles = new TreeSet<Circle>(); 
    

    然后在Circle:

    public class Circle implements Comparable<Circle> {
    

    @Override
    public int compareTo(Circle t) {
        // Return -1, 0, or 1 if this object <, equal, or > than "t"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2011-10-17
      相关资源
      最近更新 更多