Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
eval()解析器和2d数组在Java中的实现_Java_Arrays_Parsing_2d_Eval - Fatal编程技术网

eval()解析器和2d数组在Java中的实现

eval()解析器和2d数组在Java中的实现,java,arrays,parsing,2d,eval,Java,Arrays,Parsing,2d,Eval,我在两个与Java相关的问题上做了很多工作。一个简单,一个更难 关于2D数组的创建,我初始化了如下表: private String [][] table_of_classifiers = null; String [][] table_of_classifiers = { {"x1","x","x","x","x"}, {"x2","x","x","x","x"}, {"x3","x","x","x","

我在两个与Java相关的问题上做了很多工作。一个简单,一个更难

关于2D数组的创建,我初始化了如下表:

private String [][] table_of_classifiers = null;
        String [][] table_of_classifiers = {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
private String [][] table_of_classifiers = null;
String [][] table_of_classifiers = {
  {"x1","x","x","x","x"},
  {"x2","x","x","x","x"},
  {"x3","x","x","x","x"},
  {"x4","x","x","x","x"},
  {"x5","x","x","x","x"},
  {"x6","x","x","x","x"},
};
然后,在一个函数中,我像这样填充它的内容:

private String [][] table_of_classifiers = null;
        String [][] table_of_classifiers = {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
private String [][] table_of_classifiers = null;
String [][] table_of_classifiers = {
  {"x1","x","x","x","x"},
  {"x2","x","x","x","x"},
  {"x3","x","x","x","x"},
  {"x4","x","x","x","x"},
  {"x5","x","x","x","x"},
  {"x6","x","x","x","x"},
};
但是,正如您可以猜到的,第二个表(本地)覆盖了第一个表,这当然不是我想要做的。我做错了什么?请注意,表格的维度从一开始就未知。

只需执行以下操作:

class Foo {
    private String [][] table_of_classifiers = null;

    void bar() {
        table_of_classifiers = new String[][] {
                    {"x1","x","x","x","x"},
                    {"x2","x","x","x","x"},
                    {"x3","x","x","x","x"},
                    {"x4","x","x","x","x"},
                    {"x5","x","x","x","x"},
                    {"x6","x","x","x","x"},
        };
    }
}
Java没有
eval
(因为它是一种编译语言),但它确实有。但是,这几乎肯定不是你想做的事情的最佳方法。

只要做:

class Foo {
    private String [][] table_of_classifiers = null;

    void bar() {
        table_of_classifiers = new String[][] {
                    {"x1","x","x","x","x"},
                    {"x2","x","x","x","x"},
                    {"x3","x","x","x","x"},
                    {"x4","x","x","x","x"},
                    {"x5","x","x","x","x"},
                    {"x6","x","x","x","x"},
        };
    }
}

Java没有
eval
(因为它是一种编译语言),但它确实有。但是,对于你想做的事情,这几乎肯定不是最好的方法。

关于你的第一个问题:要在不重新说明的情况下分配到
分类表,请写:

        table_of_classifiers = new String[][] {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };

关于
eval
。问题是运行时没有作用域局部变量的名称,尽管它可以获取实例变量的名称,但它必须在对象的上下文中这样做。解决这类问题是可能的,但这不是小事,而且会涉及重大的妥协。我认为,在开始弄清楚
eval
将支持哪些功能之前,您必须彻底了解作用域和反射是如何工作的,因为否则,你只会对你提出的所有不可能的要求感到失望。

关于你的第一个问题:要分配到
分类表,而不重新说明它,请写:

        table_of_classifiers = new String[][] {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
关于
eval
。问题是运行时没有作用域局部变量的名称,尽管它可以获取实例变量的名称,但它必须在对象的上下文中这样做。解决这类问题是可能的,但这不是小事,而且会涉及重大的妥协。我认为,在开始弄清楚
eval
将支持哪些功能之前,您必须彻底了解作用域是如何工作的,以及反射是如何工作的,因为否则,您只会对您提供的所有不可能的需求感到失望

关于2D数组的创建,我初始化了如下表:

private String [][] table_of_classifiers = null;
        String [][] table_of_classifiers = {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
private String [][] table_of_classifiers = null;
String [][] table_of_classifiers = {
  {"x1","x","x","x","x"},
  {"x2","x","x","x","x"},
  {"x3","x","x","x","x"},
  {"x4","x","x","x","x"},
  {"x5","x","x","x","x"},
  {"x6","x","x","x","x"},
};
不是真的。这是变量的声明和初始化,该变量可以指向字符串的“2d数组”、“表格”或更精确的“数组数组”

除非处理变量可以/将为null的事实,否则将其初始化为
null
通常是个坏主意,因为您需要做额外的工作来检查null。示例:

String[][] a;
// ...
String b = a[0][0];
除非
a
在同一时间没有初始化,否则它不会编译。这是一件好事,因为您可以避免潜在的bug

String[][] a = null;
// ...
String b = a[0][0];
但是,这将被编译,如果您忘记实际为变量分配一个实数组,程序将“崩溃”并出现“空指针异常”,或者您需要添加额外的代码/工作来检查
null

我这样填写它的内容:

private String [][] table_of_classifiers = null;
        String [][] table_of_classifiers = {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
private String [][] table_of_classifiers = null;
String [][] table_of_classifiers = {
  {"x1","x","x","x","x"},
  {"x2","x","x","x","x"},
  {"x3","x","x","x","x"},
  {"x4","x","x","x","x"},
  {"x5","x","x","x","x"},
  {"x6","x","x","x","x"},
};
你不是在这里“填充”任何东西。对于要填充的内容,它必须首先存在,但您尚未创建任何内容

这里声明的是同名的第二个变量,只有在与第一个变量处于不同的作用域时才有可能,在这种情况下,如果最初可以从这个新作用域访问原始变量,则“隐藏”(“阴影”)原始变量

但正如您所猜测的,第二个表(本地)覆盖了第一个表 第一,那当然不是我想做的。我做错了什么

哪张“第一”桌?直到现在还没有第一个表,只有第一个变量。其他人已经向您展示了如何将“表”分配给原始变量,方法是不使用行首的“声明”
String[][]

否则就不可能说你“做错了”什么,因为你还没有真正解释你想做什么

请注意,表的维度从一开始就未知

不是吗?那么,您是如何/为什么使用数组文字的?文字数组用于创建具有固定“前缀”的固定大小数组

“开始”到底是什么意思?在编程时(编译时)或程序启动时(运行时),大小不是已知的吗

如果在运行时获得阵列的大小,则可以使用
new
创建普通阵列:

int a = ...; 
int b = ...; // Get the sizes from somewhere, e.g, user input 

String[][] table_of_classifiers = new String[a][b];
// Now you have an "empty" table
如果大小在运行时发生“变化”,那么(取决于您实际尝试的操作),数组是错误的工具,您应该使用
列表
实现,例如
ArrayList


关于“eval”,正如其他人所说,Java是一种编译语言,因此“eval”基本上是不可能的。这是“反射”或使用
类型来实现您所暗示的内容,但您确实需要更广泛地解释您试图实现的内容,然后在这里可能会对您有所帮助

然而,反射和类类型是一个复杂的问题,考虑到您显然在与最基本的Java概念作斗争,您还有很长的路要走,直到您能够做您想做的事情

关于2D数组的创建,我初始化了如下表:

private String [][] table_of_classifiers = null;
        String [][] table_of_classifiers = {
            {"x1","x","x","x","x"},
            {"x2","x","x","x","x"},
            {"x3","x","x","x","x"},
            {"x4","x","x","x","x"},
            {"x5","x","x","x","x"},
            {"x6","x","x","x","x"},
        };
private String [][] table_of_classifiers = null;
String [][] table_of_classifiers = {
  {"x1","x","x","x","x"},
  {"x2","x","x","x","x"},
  {"x3","x","x","x","x"},
  {"x4","x","x","x","x"},
  {"x5","x","x","x","x"},
  {"x6","x","x","x","x"},
};
不是真的。这是变量的声明和初始化,该变量可以指向字符串的“2d数组”、“表格”或更精确的“数组数组”

除非处理变量可以/将为null的事实,否则将其初始化为
null
通常是个坏主意,因为您需要做额外的工作来检查null。示例:

String[][] a;
// ...
String b = a[0][0];
这不会编译,除非
a