在map-reduce java中切换字符串的奇怪错误

时间:2017-08-29 10:57:04

标签: java string hadoop mapreduce

所以我有 Reduce 功能:

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    for (Text value: values){
        Matrix matrix = new Matrix(value.toString());
        String name = matrix.get_name(); // Return "A" or "B"
        context.write(key, new Text(name));
    }

}

执行这段代码给了我类似的东西(这很有意义):

0,0 A
0,1 A
...
0,0 B
...

然后当我尝试切换&#34; name&#34;:

的值时
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    for (Text value: values){
        Matrix matrix = new Matrix(value.toString());
        String name = matrix.get_name(); // Return "A" or "B"
        switch (name){
            case "A":
                context.write(key, new Text("AA"));
                break;
            case "B":
                context.write(key, new Text("BB"));
                break;
            default:
                context.write(key, new Text("CC"));
                break;
        }
    }
}

上面的代码给了我这个结果:

0,0 CC
0,1 CC
...

我不明白为什么我的switch语句在这种情况下有效(使用equals来比较也不起作用)

有什么指针可以解决这个问题吗?

我们将不胜感激。

//更新:

使用trim()和equalsIgnoreCase()也不起作用:

if ("A".equalsIgnoreCase(name.trim())){
    context.write(key, new Text("AA"));
}
else if ("B".equalsIgnoreCase(name.trim())){
    context.write(key, new Text("BB"));
}
else{
    context.write(key, new Text("CC"));
}

1 个答案:

答案 0 :(得分:1)

当然,不要使用switch语句比较字符串,按顺序使用trim()和equalsIgnoreCase()以及if else。

if(name.trim().equalsIgnoreCase("A"){...}

else if name.trim().equalsIgnoreCase("B"){...}
else ...