数组创建堆栈溢出
Array Creation Stack overflow
我收到一个错误,它会不断给我堆栈溢出。我基本上想做的是创建一个包含矩形对象的数组列表。但是,如果任何对象彼此重叠,我将再次调用该方法并创建一个数组,直到它创建一个不重叠的对象数组。谁能告诉我怎么了?
public class TokenArrayCreator {
public final int TOKEN_WIDTH= 35;
private GameToken token1;
private ArrayList<GameToken> tokenarr;
public TokenArrayCreator()
{}
public ArrayList<GameToken> ArrayCreator()
{
ArrayList<GameToken> tokenArray = new ArrayList<GameToken>();
Random random = new Random();
for(int i =0; i<=10 ;i++)
{
GameToken token= new GameToken(random.nextInt(300),random.nextInt(300),35,35);
tokenArray.add(token);
}
for(int i =0 ; i<=10 ; i++) // make two list i and j && if i != j
{
for(int j= 0; j<=10 ; j++)
{
if(i!=j)
{
if(tokenArray.get(i).overlaps(tokenArray.get(j)))
{
TokenArrayCreator t1= new TokenArrayCreator();
t1.ArrayCreator();
}
}
else break;
}
}
return tokenArray;
}
以上是我的数组创建者class。下面是我在另一个 class.
中的重叠方法
public boolean overlaps(VisibleShape other)
{
GameToken other1 = (GameToken) other;
if(this.bbox.intersects(other1.bbox))
{
return true;
}
else return false;
}
这是堆栈跟踪
Exception in thread "main" java.lang.WhosebugError
at java.util.Hashtable.hash(Unknown Source)
at java.util.Hashtable.get(Unknown Source)
at javax.swing.UIDefaults.getFromHashtable(Unknown Source)
at javax.swing.UIDefaults.get(Unknown Source)
at javax.swing.MultiUIDefaults.get(Unknown Source)
at javax.swing.UIDefaults.getFont(Unknown Source)
at javax.swing.UIManager.getFont(Unknown Source)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at CircPattern.<init>(CircPattern.java:25)
at Pattern.<init>(Pattern.java:40)
at GameToken.<init>(GameToken.java:18)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:26)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
基本上,您在做什么,每次找到两个相交的对象时,您都在创建 TokenArrayCreator
的 全新 实例,然后将其称为 ArrayCreator
方法。
这会创建一个全新的 ArrayList
并尝试再次填充它,当它找到相交的对象时,它会创建一个全新的 TokenArrayCreator
的实例并调用它是 ArrayCreator
...一遍又一遍...
除了 none 这些实例彼此之间有任何关系(其中 none 知道对方创造了什么),很少有人能够创建一个完整的非重叠对象数组,这就是你的问题。
相反,请考虑从 ArrayList
中删除其中一个有问题的对象并继续尝试创建对象,直到它达到所需的大小,例如...
public class TokenArrayCreator {
public final int TOKEN_WIDTH = 35;
private ArrayList<Rectangle> tokenarr;
public TokenArrayCreator() {
}
public void ArrayCreator() {
tokenarr = new ArrayList<Rectangle>();
Random random = new Random();
int requiredObjectCount = 11;
while (tokenarr.size() < requiredObjectCount) {
for (int i = 0; i < requiredObjectCount - tokenarr.size(); i++) {
Rectangle token = new Rectangle(random.nextInt(300), random.nextInt(300), 35, 35);
tokenarr.add(token);
}
for (int i = 0; i < tokenarr.size(); i++) // make two list i and j && if i != j
{
for (int j = 0; j < tokenarr.size(); j++) {
if (i != j) {
if (tokenarr.get(i).intersects(tokenarr.get(j))) {
tokenarr.remove(j);
}
}
}
}
}
}
public ArrayList<Rectangle> getList() {
return tokenarr;
}
}
现在,从我的角度来看,这可能不是 "fastest" 解决方案,因为您需要循环多次才能使 ArrayList
正确填充并且时间不一致(每次你 运行 它,它会花费不同的时间 运行 )并且它永远不会 return 的可能性非常小(取决于可用大小和数量您创建的对象),但它会解决您的即时问题
我收到一个错误,它会不断给我堆栈溢出。我基本上想做的是创建一个包含矩形对象的数组列表。但是,如果任何对象彼此重叠,我将再次调用该方法并创建一个数组,直到它创建一个不重叠的对象数组。谁能告诉我怎么了?
public class TokenArrayCreator {
public final int TOKEN_WIDTH= 35;
private GameToken token1;
private ArrayList<GameToken> tokenarr;
public TokenArrayCreator()
{}
public ArrayList<GameToken> ArrayCreator()
{
ArrayList<GameToken> tokenArray = new ArrayList<GameToken>();
Random random = new Random();
for(int i =0; i<=10 ;i++)
{
GameToken token= new GameToken(random.nextInt(300),random.nextInt(300),35,35);
tokenArray.add(token);
}
for(int i =0 ; i<=10 ; i++) // make two list i and j && if i != j
{
for(int j= 0; j<=10 ; j++)
{
if(i!=j)
{
if(tokenArray.get(i).overlaps(tokenArray.get(j)))
{
TokenArrayCreator t1= new TokenArrayCreator();
t1.ArrayCreator();
}
}
else break;
}
}
return tokenArray;
}
以上是我的数组创建者class。下面是我在另一个 class.
中的重叠方法public boolean overlaps(VisibleShape other)
{
GameToken other1 = (GameToken) other;
if(this.bbox.intersects(other1.bbox))
{
return true;
}
else return false;
}
这是堆栈跟踪
Exception in thread "main" java.lang.WhosebugError
at java.util.Hashtable.hash(Unknown Source)
at java.util.Hashtable.get(Unknown Source)
at javax.swing.UIDefaults.getFromHashtable(Unknown Source)
at javax.swing.UIDefaults.get(Unknown Source)
at javax.swing.MultiUIDefaults.get(Unknown Source)
at javax.swing.UIDefaults.getFont(Unknown Source)
at javax.swing.UIManager.getFont(Unknown Source)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at CircPattern.<init>(CircPattern.java:25)
at Pattern.<init>(Pattern.java:40)
at GameToken.<init>(GameToken.java:18)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:26)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
at TokenArrayCreator.ArrayCreator(TokenArrayCreator.java:40)
基本上,您在做什么,每次找到两个相交的对象时,您都在创建 TokenArrayCreator
的 全新 实例,然后将其称为 ArrayCreator
方法。
这会创建一个全新的 ArrayList
并尝试再次填充它,当它找到相交的对象时,它会创建一个全新的 TokenArrayCreator
的实例并调用它是 ArrayCreator
...一遍又一遍...
除了 none 这些实例彼此之间有任何关系(其中 none 知道对方创造了什么),很少有人能够创建一个完整的非重叠对象数组,这就是你的问题。
相反,请考虑从 ArrayList
中删除其中一个有问题的对象并继续尝试创建对象,直到它达到所需的大小,例如...
public class TokenArrayCreator {
public final int TOKEN_WIDTH = 35;
private ArrayList<Rectangle> tokenarr;
public TokenArrayCreator() {
}
public void ArrayCreator() {
tokenarr = new ArrayList<Rectangle>();
Random random = new Random();
int requiredObjectCount = 11;
while (tokenarr.size() < requiredObjectCount) {
for (int i = 0; i < requiredObjectCount - tokenarr.size(); i++) {
Rectangle token = new Rectangle(random.nextInt(300), random.nextInt(300), 35, 35);
tokenarr.add(token);
}
for (int i = 0; i < tokenarr.size(); i++) // make two list i and j && if i != j
{
for (int j = 0; j < tokenarr.size(); j++) {
if (i != j) {
if (tokenarr.get(i).intersects(tokenarr.get(j))) {
tokenarr.remove(j);
}
}
}
}
}
}
public ArrayList<Rectangle> getList() {
return tokenarr;
}
}
现在,从我的角度来看,这可能不是 "fastest" 解决方案,因为您需要循环多次才能使 ArrayList
正确填充并且时间不一致(每次你 运行 它,它会花费不同的时间 运行 )并且它永远不会 return 的可能性非常小(取决于可用大小和数量您创建的对象),但它会解决您的即时问题