Java 2D Array,将分配随机值而不是应该分配的值

时间:2018-03-30 05:30:24

标签: java arrays eclipse multidimensional-array repast-simphony

编辑3:此问题已得到解答。我多次错误地做了数学运算并犯了大错,因此没有意识到代码库本身很好

这里有关于stackoverflow的第一个问题。

所以我正在运行模拟,在我的代码中,我需要建模资源折旧,这很简单,减少了25%。简单。但由于某些原因,每当我改变尝试将值更改为2D数组中保存的原始值的75%时,它会将其更改为100,而不是任何数字。当我打印出我设置它的值时,它给了我正确的数字,但是当我实际设置它时,它只会变为100.任何提示或帮助将非常感激。

顺便说一下,这些数组是全局的,并且保护了类型为int的2d数组。

代码段:因此,在此代码段中,System.out.println会在实际分配注释掉时打印出正确的值,但在实际分配时,它会更改为100.

我已经尝试了一些选项,并且仍在尝试修复它,但我很想知道其他人是否曾遇到类似的问题?

编辑:我已经更新了数组的声明和数组变换的唯一其他函数。在资源提取功能之后数组值很好,但在使用函数期间,当我尝试分配新值时,一切都会出错占当前持有量的75%。

因此,例如,数组中的数字是4000,然后在消耗之后它应该是3000,但是不是3000那行只打印出72,因为截断后72是3/4的97。但是当分配被注释掉并运行时,所有数字都会正确地增加到例如4869之类的数字。

Edit2:

我发布了我的全部代码。模拟一遍又一遍地进行。因此,提取和消费一遍又一遍地进行。我已经完成了数学运算,我发布的错误仍然存​​在,只会根据代理和资源的数量而改变。

实施例。 agent = 24,resource = 24,然后在几次迭代后由于某种原因它的上限为24,当agent = 8且resource = 8时,它的上限为72。 我做了数学计算,并且因为公式如何工作,它们不应该在每次迭代中获得相同的量,直到达到像10000这样的真正高的数字。

对不起所有的讽刺,我感谢到目前为止所得到的所有帮助!

2 个答案:

答案 0 :(得分:0)

刚出头,它可能与数组类型有关。

resourcesHeld [i] [j] * 3/4 是一个带有表达式类型的表达式,使用System.out.println(expr)将使用与expr匹配的方法之一。

将其分配回resourcesHeld可能会强制将值转换为数组类型,从而强制它更改值。

现在我假设如果java需要将值缩小到类型,你会得到异常或编译错误。

答案 1 :(得分:0)

以下按预期方式工作:

public class SO1 {

    int agentCount = 1;
    int resourceCount = 1;
    int[][] resourcesHeld = new int[agentCount][resourceCount];

    public void resourceConsumption() {
        for (int i = 0; i < agentCount; i++) {
            for (int j = 0; j < resourceCount; j++) {
                resourcesHeld[i][j] = resourcesHeld[i][j] * 3 / 4;
            }
        }
    }

    public static void main(String[] args) {
        SO1 s = new SO1();

        s.resourcesHeld[0][0] = 4000;
        s.resourceConsumption();
        System.err.println(s.resourcesHeld[0][0]); // 3000
    }
}

我怀疑resourcesHeld中的值不是您在调用resourceConsumption()之前所认为的值,或者您稍后会修改它们。

您可以修改代码以验证:

public void resourceConsumption() {
    for (int i = 0; i < agentCount; i++) {
        for (int j = 0; j < resourceCount; j++) {
            System.err.println("BEFORE: " + resourcesHeld[i][j]);
            resourcesHeld[i][j] = resourcesHeld[i][j] * 3 / 4;
            System.err.println("AFTER: " + resourcesHeld[i][j]);

        }
    }
}

修改

嗯,在step()的一些迭代之后看起来(在8个代理的情况下)resourcesHeld的值是97.然后resourceConsumption()带来的是72,然后{ {1}}把它带回97.

换句话说,某些时候resourceExtract()会将resourceExtract()的值增加3/4,resourcesHeld会将它们减少3/4。从这一点开始,你会在这两个值之间振荡。