在 Java 中使用变量的引用数组
reference array using variable in Java
请耐心等待,我已经使用 Java 2 天了,遇到了一些障碍。
我正在使用 Talend 通过 tMemorize 和 tJava 组件执行计数,但这可能是 Java 开发人员的问题。我之前发布了一个关于在 joblet 中使用此方法的问题,我的新问题更 Java 相关,可以在此处查看:
using Joblets in talend with tMemorize and tJavaFlex
我需要引用由 java 代码 talend 生成的数组。我无法直接引用此元素,因为在多个 joblet 中使用 tJavaFlex 时出现问题:Java 每次使用时都会重命名 joblet。
了解我的代码在正常情况下的工作方式(不包括使用 joblet)可能会有用。
int counter = 1;
if (EnquiryID_mem_1_tMemorizeRows_1[0].equals(EnquiryID_mem_1_tMemorizeRows_1[1]))
{
counter++;
}
row3.counter = counter;
EnquiryID_mem_1_tMemorizeRows_1[0]
和EnquiryID_mem_1_tMemorizeRows_1[1]
是我需要参考的
为了克服这个问题,我编写了以下代码。
String string = currentComponent;
String[] parts = string.split("_");
String part1 = parts[0];
String part2 = parts[1];
String joblet = part1+'_'+part2;
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
if (newrow[0].equals(newrow[1]))
{
counter++;
}
row3.counter = counter;
但是我收到以下错误:
The type of the expression must be an array type but it resolved to String
我知道 newrow
变量是一个字符串,我用它来引用一个数组。我在网上广泛搜索了一个解决方案,但我找不到解决方案。有人可以帮我吗?
谢谢
这是我的代码应该引用的 talend 代码。我把它从我正在使用的currentComponent中取出来,当它直接变成一个不用的时候。
currentComponent = "mem_1_tMemorizeRows_1";
// row1
// row1
if (execStat) {
runStat.updateStatOnConnection("row1" + iterateId,
1, 1);
}
for (int i_mem_1_tMemorizeRows_1 = iRows_mem_1_tMemorizeRows_1 - 1; i_mem_1_tMemorizeRows_1 > 0; i_mem_1_tMemorizeRows_1--) {
EnquiryID_mem_1_tMemorizeRows_1[i_mem_1_tMemorizeRows_1] = EnquiryID_mem_1_tMemorizeRows_1[i_mem_1_tMemorizeRows_1 - 1];
}
EnquiryID_mem_1_tMemorizeRows_1[0] = row1.EnquiryID;
mem_1_row2 = row1;
tos_count_mem_1_tMemorizeRows_1++;
/**
* [mem_1_tMemorizeRows_1 main ] stop
*/
/**
* [mem_1_tJavaFlex_1 main ] start
*/
currentComponent = "mem_1_tJavaFlex_1";
// mem_1_row2
// mem_1_row2
if (execStat) {
runStat.updateStatOnConnection("mem_1_row2"
+ iterateId, 1, 1);
}
mem_1_row3.QuoteID = mem_1_row2.QuoteID;
mem_1_row3.EnquiryID = mem_1_row2.EnquiryID;
if (EnquiryID_mem_1_tMemorizeRows_1[0]
.equals(EnquiryID_mem_1_tMemorizeRows_1[1])) {
rower++;
}
mem_1_row3.rower = rower;
tos_count_mem_1_tJavaFlex_1++;
/**
* [mem_1_tJavaFlex_1 main ] stop
*/
/**
* [mem_1_tMap_1 main ] start
*/
currentComponent = "mem_1_tMap_1";
感谢迄今为止提供帮助的所有人。
这个
if (newrow[0].equals(newrow[1]))
尝试选取数组的第一个和第二个元素newrow
。很遗憾,您将 newrow
声明为
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
这不是 array
,而是 String
。 if
中的语法不适用于 String
。我不确定您要做什么,但是 if 检查将不起作用。
编辑:
如果您尝试从字符串中获取 char
,则需要使用 charAt(index)
.
如果您想将 newrow
视为一个数组,您必须这样声明它并将适当的元素传递给它。
编辑 2:我认为您正试图将 joblet
中的实际数据传递给 newrow
中:
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
但是这里发生的是所有内容都连接在一个 String
中,因此您需要弄清楚您要查找的数据在哪里(我假设是 part[0]
和 part[1]
)存在于 String
中,因此您可以将它们拉出(基本上是什么索引包含您要查找的值)。
newrow 如何处理该分配的示例:
"EnquiryID_part1_part2_tMemorizeRows_1"
所以 "part1"
将从索引 10 开始,将在索引 14 结束。我只是在这里使用 "part1"
,但它会具有存储在 part1
变量中的任何值。
如果您能向我们展示您期望的外观,那将会有所帮助。
我对 talend 不是很熟悉(理解:一点也不)。但听起来您拥有生成的 class(比如 myGeneratedObject)的某种属性,并且您想通过名称访问它。
在这种情况下,您可以执行以下操作:
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
Field field = myGeneratedObject.getClass().getField(newrow);
if (field.getClass().isArray()) {
if(Array.get(field, 0).equals(Array.get(field, 1)) {
counter++;
}
}
这完全取决于您真正访问该字段的方式以及声明它的位置。但如果它是一个对象的属性,那么上面的代码应该可以工作,+/- 上下文调整,因为我对确切问题缺乏了解。
请耐心等待,我已经使用 Java 2 天了,遇到了一些障碍。
我正在使用 Talend 通过 tMemorize 和 tJava 组件执行计数,但这可能是 Java 开发人员的问题。我之前发布了一个关于在 joblet 中使用此方法的问题,我的新问题更 Java 相关,可以在此处查看: using Joblets in talend with tMemorize and tJavaFlex
我需要引用由 java 代码 talend 生成的数组。我无法直接引用此元素,因为在多个 joblet 中使用 tJavaFlex 时出现问题:Java 每次使用时都会重命名 joblet。
了解我的代码在正常情况下的工作方式(不包括使用 joblet)可能会有用。
int counter = 1;
if (EnquiryID_mem_1_tMemorizeRows_1[0].equals(EnquiryID_mem_1_tMemorizeRows_1[1]))
{
counter++;
}
row3.counter = counter;
EnquiryID_mem_1_tMemorizeRows_1[0]
和EnquiryID_mem_1_tMemorizeRows_1[1]
是我需要参考的
为了克服这个问题,我编写了以下代码。
String string = currentComponent;
String[] parts = string.split("_");
String part1 = parts[0];
String part2 = parts[1];
String joblet = part1+'_'+part2;
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
if (newrow[0].equals(newrow[1]))
{
counter++;
}
row3.counter = counter;
但是我收到以下错误:
The type of the expression must be an array type but it resolved to String
我知道 newrow
变量是一个字符串,我用它来引用一个数组。我在网上广泛搜索了一个解决方案,但我找不到解决方案。有人可以帮我吗?
谢谢
这是我的代码应该引用的 talend 代码。我把它从我正在使用的currentComponent中取出来,当它直接变成一个不用的时候。
currentComponent = "mem_1_tMemorizeRows_1";
// row1
// row1
if (execStat) {
runStat.updateStatOnConnection("row1" + iterateId,
1, 1);
}
for (int i_mem_1_tMemorizeRows_1 = iRows_mem_1_tMemorizeRows_1 - 1; i_mem_1_tMemorizeRows_1 > 0; i_mem_1_tMemorizeRows_1--) {
EnquiryID_mem_1_tMemorizeRows_1[i_mem_1_tMemorizeRows_1] = EnquiryID_mem_1_tMemorizeRows_1[i_mem_1_tMemorizeRows_1 - 1];
}
EnquiryID_mem_1_tMemorizeRows_1[0] = row1.EnquiryID;
mem_1_row2 = row1;
tos_count_mem_1_tMemorizeRows_1++;
/**
* [mem_1_tMemorizeRows_1 main ] stop
*/
/**
* [mem_1_tJavaFlex_1 main ] start
*/
currentComponent = "mem_1_tJavaFlex_1";
// mem_1_row2
// mem_1_row2
if (execStat) {
runStat.updateStatOnConnection("mem_1_row2"
+ iterateId, 1, 1);
}
mem_1_row3.QuoteID = mem_1_row2.QuoteID;
mem_1_row3.EnquiryID = mem_1_row2.EnquiryID;
if (EnquiryID_mem_1_tMemorizeRows_1[0]
.equals(EnquiryID_mem_1_tMemorizeRows_1[1])) {
rower++;
}
mem_1_row3.rower = rower;
tos_count_mem_1_tJavaFlex_1++;
/**
* [mem_1_tJavaFlex_1 main ] stop
*/
/**
* [mem_1_tMap_1 main ] start
*/
currentComponent = "mem_1_tMap_1";
感谢迄今为止提供帮助的所有人。
这个
if (newrow[0].equals(newrow[1]))
尝试选取数组的第一个和第二个元素newrow
。很遗憾,您将 newrow
声明为
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
这不是 array
,而是 String
。 if
中的语法不适用于 String
。我不确定您要做什么,但是 if 检查将不起作用。
编辑:
如果您尝试从字符串中获取 char
,则需要使用 charAt(index)
.
如果您想将 newrow
视为一个数组,您必须这样声明它并将适当的元素传递给它。
编辑 2:我认为您正试图将 joblet
中的实际数据传递给 newrow
中:
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
但是这里发生的是所有内容都连接在一个 String
中,因此您需要弄清楚您要查找的数据在哪里(我假设是 part[0]
和 part[1]
)存在于 String
中,因此您可以将它们拉出(基本上是什么索引包含您要查找的值)。
newrow 如何处理该分配的示例:
"EnquiryID_part1_part2_tMemorizeRows_1"
所以 "part1"
将从索引 10 开始,将在索引 14 结束。我只是在这里使用 "part1"
,但它会具有存储在 part1
变量中的任何值。
如果您能向我们展示您期望的外观,那将会有所帮助。
我对 talend 不是很熟悉(理解:一点也不)。但听起来您拥有生成的 class(比如 myGeneratedObject)的某种属性,并且您想通过名称访问它。
在这种情况下,您可以执行以下操作:
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
Field field = myGeneratedObject.getClass().getField(newrow);
if (field.getClass().isArray()) {
if(Array.get(field, 0).equals(Array.get(field, 1)) {
counter++;
}
}
这完全取决于您真正访问该字段的方式以及声明它的位置。但如果它是一个对象的属性,那么上面的代码应该可以工作,+/- 上下文调整,因为我对确切问题缺乏了解。