【问题标题】:Array Creation Stack overflow数组创建堆栈溢出
【发布时间】:2015-03-13 00:16:09
【问题描述】:

我收到一个错误,它会不断给我一个堆栈溢出。我基本上想做的是创建一个具有矩形的对象的数组列表。但是,如果任何对象相互重叠,我会再次调用该方法并创建一个数组,直到它创建一个不重叠的对象数组。谁能告诉我怎么了?

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;
}  

上面是我的数组创建者类。下面是我在另一个类中的重叠方法。

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.StackOverflowError
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)

【问题讨论】:

  • 什么是错误/它指向哪里?
  • 每次调用t1.ArrayCreator(); 时,您都在创建一个全新的 ArrayList,然后它会尝试用对象填充自己,然后找到重叠的元素,然后创建t1.ArrayCreator(); 的一个新实例,邪恶的循环又开始了……
  • 发布堆栈跟踪。
  • 正如 MadProgrammer 所说...你已经 ForkBombedYourself
  • 无限递归是栈溢出最常见的原因。

标签: java arrays shapes rectangles


【解决方案1】:

基本上,你在做什么,每次你找到两个相交的对象,你都在创建TokenArrayCreator全新实例,然后调用它的ArrayCreator方法。

这会创建一个全新 ArrayList 并尝试再次填充它,当它找到相交的对象时,它会创建一个TokenArrayCreator全新实例并调用这是ArrayCreator....一遍又一遍...

除了这些实例彼此之间没有任何关系(它们都不知道另一个创建了什么)之外,很少有人能够创建完整的非重叠对象数组,因此你的问题。

相反,请考虑从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;
    }

}

现在,从我的角度来看,这可能不是“最快”的解决方案,因为您需要循环多次才能使 ArrayList 正确填充并且它的时间不一致(每次运行它时) ,运行时间不同)并且它永远不会返回的可能性很小(取决于可用大小和您创建的对象数量),但它会解决您的即时问题

【讨论】:

  • 非常感谢!!现在,如果你不介意的话。为了知识,我可以知道您的最佳解决方案是什么?
  • 我不知道。这就是我想出的。毫无疑问,有一些非常棒的数学公式,我不知道如何创建,更不用说知道它是如何工作的,这会带来更好的性能......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
相关资源
最近更新 更多