/ /同じセット内のアイテムを互いに比較する - java、list、loops、foreach、set

同じセット内のアイテムを互いに比較する - java、list、loops、foreach、set

私は形状のセットを持っており、どの形状が交差しているかを判断する必要があります。私は現在、for-loops(1つは他のものの中にありますが)期待どおりに動作していません。それだけを比較しているようです Shape それ自体で私は println() デバッグを目的としており、コンソール出力はこの質問の最後にあります。

編集: 私は自分のインターフェースのコードを追加しました Drawables 方法を示す intersects(Rectangle rectangle) そして Shape.getBounds() 露出される。私はまた、私の Collisions そのメソッドが何をしているのかを示すクラスです。

編集2: 私は言及を怠ったと信じることはできません: drawables セットです! drawables.add() 次のように振舞う Set.add()

*編集8564985294238424:*私は決してセットを初期化しない collisions。私はこれを修正した。今すぐ動作します。


クラスCollisionMonitor (問題の方法を含む: Set<Collision> getCollisions() クラスの最後の部分です)

package platformer;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;


public class CollisionMonitor
{

private Set<Collision> collisions;
private Set<Drawable> drawables;

public CollisionMonitor(Set<Drawable> drawables)
{
this.drawables = drawables;
}

public Set<Drawable> getDrawables()
{
return drawables;
}

public void setDrawables(Collection<? extends Drawable> drawables)
{
if (drawables != null)
this.drawables = (new HashSet<Drawable>(drawables));
}

public Set<Drawable> addDrawables(Collection<? extends Drawable> drawables)
{
if (drawables != null && drawables.isEmpty() == false)
this.drawables.addAll(drawables);
return this.drawables;
}

public Set<Collision> getCollisions()    //Problem method!
{
Set<Drawable> temp = drawables;

for (Drawable s : drawables)
{
for (Drawable ss : temp)
{
System.out.println(s + ", " + ss);
/*if (s.intersects(ss.getBounds()))
{
collisions.add(new Collision(s, ss));
}*/
}
}

return collisions;
}

}

インタフェースDrawable:

public interface Drawable extends Shape
{
Color color = new Color(0, 0, 0);

public Color getColor();
}

クラスの衝突

public class Collision
{

Drawable drawable1, drawable2;

public Collision(Drawable drawable1, Drawable drawable2)
{
this.drawable1 = drawable1;
this.drawable2 = drawable2;
}

}

出力:

platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@26dea769, platformer.Bullet@26dea769
platformer.Bullet@f1e9457d, platformer.Bullet@f1e9457d
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@11bd2f5a, platformer.Bullet@11bd2f5a
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@70a511a, platformer.Bullet@70a511a
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@6ada16bc, platformer.Bullet@6ada16bc
platformer.Bullet@6ba127e8, platformer.Bullet@6ba127e8

回答:

回答№1は0

temp 何か違う drawables。同じオブジェクトを指しています。

まったく同じ要素を除外したい場合は:

for (Drawable s : drawables)
{
for (Drawable ss : temp)
{
if (s == ss) continue;  // don"t compare the object to itself