我请耐心等待,我已经使用Java 2天了,我遇到了一些障碍。
我正在使用Talend使用tMemorize和tJava组件执行计数,但这可能是Java开发人员的问题。我以前发过一个问题,在我的新问题中使用此方法在joblet中更多Java相关,可以在这里查看: using Joblets in talend with tMemorize and tJavaFlex
我需要引用java代码talend生成的数组。由于在多个joblet中使用tJavaFlex的问题,我无法直接引用此元素:Java每次使用时都会重命名joblets。
理解我的代码在正常情况下的工作方式(不包括使用joblets)可能很有用。
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";
感谢所有迄今为止帮助过的人。
答案 0 :(得分:2)
此
if (newrow[0].equals(newrow[1]))
尝试选择数组newrow
的第一个和第二个元素。不幸的是,您将newrow
声明为
String newrow = "EnquiryID_"+joblet+"_tMemorizeRows_1"
不是array
而是String
。 if
中的语法不适用于String
。我不确定你要做什么,但如果检查不起作用。
编辑:
如果您尝试从字符串中选择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
变量中存储任何值。
如果您能告诉我们您的期望,那将会有所帮助。
答案 1 :(得分:0)
我对talend并不是很熟悉(理解:根本不是)。但听起来你有一个生成类的某种属性(比如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++;
}
}
这完全取决于您如何真正地访问该字段以及声明它的位置。但如果它是一个对象的属性,那么由于我对确切问题缺乏了解,上面的代码应该起作用,+ / - 上下文调整。