Java 我的树集似乎有一个大小值1,其中应该是未定义的
出于某种原因,我的列表只允许一个元素。当我删除元素时,它允许创建另一个元素,但我不能同时有两个圆 以下是小程序:Java 我的树集似乎有一个大小值1,其中应该是未定义的,java,applet,iterator,set,treeset,Java,Applet,Iterator,Set,Treeset,出于某种原因,我的列表只允许一个元素。当我删除元素时,它允许创建另一个元素,但我不能同时有两个圆 以下是小程序: 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.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
}
此外,在这里^^^^,它应该每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.awt.Color;导入java.awt.Graphics;导入java.util.Random;
公共课圈实施可比性{
int(x),y,yb,sp,乘数; double(m),radiusRandom gen=new Random();
int r=(int)(gen.nextDouble()*255),b=(int)(gen.nextDouble()*255),g=(int)(gen.nextDouble()*255);
公共圈(整数x,整数y,整数范围,整数乘数){
_x=x;y=y;
_radius=(int)(gen.nextDouble()*range);if(_radiusASet
将不允许多个元素比较equal
。的使用将依赖于调用compareTo
[A] TreeSet实例使用其compareTo(或compare)方法执行所有元素比较
您确实在Circle
中定义了compareTo
。但是,您的compareTo
方法总是返回0
,因此您的Circle
对象将进行相等的比较,并且只有一个对象将进入树集
您需要正确定义比较方法
此外,您可能希望使用树集
类上的泛型,并在圆圈
中实现可比
的泛型形式,例如:
Set<Circle> circles;
及
@覆盖
公共整数比较(圆t){
//如果此对象大于“t”,则返回-1、0或1
}
Set<Circle> circles;
circles = new TreeSet<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"
}