从其他类访问cplex java变量

从其他类访问cplex java变量,java,cplex,Java,Cplex,我在Java中使用cplex,我想从另一个类访问变量的值 (解决后) 我的程序配置类应该打印变量p15[i][j][q],如下所示: import [...] public class Ausführung { public static void main(String[] args) throws IOException { try{ String filename = "[...] Data data = new Data(filename)

我在Java中使用cplex,我想从另一个类访问变量的值 (解决后)

我的程序配置类应该打印变量p15[i][j][q],如下所示:

import [...]
public class Ausführung {
public static void main(String[] args) throws IOException {
try{
            String filename = "[...]
            Data data = new Data(filename);

            IloCplex cplex = new IloCplex();
            IloNumVar[][][] w = new IloIntVar[n][n][n]; 

            MainTSP.buildModel(cplex, data, w);

            if(cplex.solve()){
            for(int q=0; q< data.distance1.length-1; q++){
                for(int ii=0; ii<data.distance1.length; ii++){
                    for(int j=0; j<data.distance1.length; j++){
                       if(cplex.getValue(p15[i][j][q]) >= 1) System.out.println("p15");
                    }
                }
            }
            cplex.end();
        }
        [...]
    }
}
public class MainTSP {
    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

    IloNumVar[][][] p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]
public class MainTSP {
    static IloNumVar[][][] p15;

    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

        p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]
导入[…]
奥斯富隆公务舱{
公共静态void main(字符串[]args)引发IOException{
试一试{
字符串filename=“[…]
数据=新数据(文件名);
IloCplex cplex=新的IloCplex();
IloNumVar[][]w=新的IloIntVar[n][n][n];
MainTSP.buildModel(cplex,data,w);
if(cplex.solve()){
对于(int q=0;q对于(int ii=0;ii您可以使用语法
OtherClass.p15
访问另一个类中声明的
静态
变量。如果该变量是实例变量(声明中没有
静态
关键字),则需要另一个类的实例来访问该变量:

OtherClass thing = . . .;
. . . cplex.getValues(thing.p15[i][j][q]) . . .
在这两种情况下,您都需要确保变量具有权限,以便引用代码可以访问它

如果不了解您的总体软件结构,就很难说解决问题的“最优雅”的方法是什么

编辑:编辑后,我想我看到了问题。当方法
buildModel
返回时,局部变量
p15
不再存在(超出范围)。您需要将数组存储在某个位置。我认为最简单的更改是修改
MainTSP
类,使其看起来如下:

import [...]
public class Ausführung {
public static void main(String[] args) throws IOException {
try{
            String filename = "[...]
            Data data = new Data(filename);

            IloCplex cplex = new IloCplex();
            IloNumVar[][][] w = new IloIntVar[n][n][n]; 

            MainTSP.buildModel(cplex, data, w);

            if(cplex.solve()){
            for(int q=0; q< data.distance1.length-1; q++){
                for(int ii=0; ii<data.distance1.length; ii++){
                    for(int j=0; j<data.distance1.length; j++){
                       if(cplex.getValue(p15[i][j][q]) >= 1) System.out.println("p15");
                    }
                }
            }
            cplex.end();
        }
        [...]
    }
}
public class MainTSP {
    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

    IloNumVar[][][] p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]
public class MainTSP {
    static IloNumVar[][][] p15;

    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

        p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]
似乎没有任何理由将
p15
设置为实例字段(如果出于其他原因需要将其设置为实例字段,则需要使用
MainTSP=new MainTSP();
之类的方法创建
MainTSP
的实例)

另一种方法是创建
buildModel
return
p15
,然后将返回值分配给
Ausführung
类中名为
p15
的另一个变量:

public class MainTSP {

    static IloNumVar[][][] buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

        p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
        return p15;
[...]

(也许这就是您计划对
w
参数所做的操作?也许只需在
buildModel
中将
p15
替换为
w
即可解决您的问题。)

我添加了一些关于程序结构的更多信息。我如何确切地创建另一个类的实例?@Hendrik-这很有帮助。我在回答中添加了一些代码,建议使用几种不同的方法来处理此问题。