eval()解析器和2d数组在Java中的实现
我在两个与Java相关的问题上做了很多工作。一个简单,一个更难 关于2D数组的创建,我初始化了如下表: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","
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