将<string>设置为[1.0,1]作为不同的值</string>

时间:2015-02-27 06:09:57

标签: java set

我有一个这样的代码序列,它是数据挖掘算法的准确性检查的一部分。

即将经过训练的数据与我的算法中的某些预测值进行比较,并比较两个类别标签进行准确性检查。

说我的值是[No,No],[No,Yes],[1.0,1],[1,1],[1,0],它们是类标签 我想比较我预测数据的准确性

public void reduce(Text key, Iterable<Text> values, Context context)
    Set<String> set = new HashSet<String>();
    for (Text val : values) {
        set.add(val.toString());
    }
    int count = set.size();
    if(count == 1){
        System.out.println("Correct class label");
        corClass++;
    }
    else{
        System.out.println("InCorrect class label");
    }

[No,No]: Correct class label
[No,Yes]: InCorrect class label 
[1.0,1]: InCorrect class label
[1,1]: Correct class label
[1,0]:InCorrect class label

对于我 [1.0,1] ,这会落入错误的classlabel

Set<String> set将[1.0,1]视为不同,尽管它们相等但是为double和整数。

如何修复变通方法。

请建议

提前致谢。

3 个答案:

答案 0 :(得分:3)

您似乎有规则,您的代码不尊重。你说1.0是&#34; double&#34;。是否有规则确定代码在哪种条件下是双倍的?例如,是&#34; 1e10&#34;一双 - 1 x 10 ^ 10?或者是#34;是&#34;大概是?

1.01是不同的字符串。如果你有一些比较规则让这两件事情完全相同,你就必须在某个地方实施它 - 它不会通过魔法发生。从你的问题中不清楚这条规则究竟是什么,但无论它是什么,都要实施它。

答案 1 :(得分:1)

您没有存储一组严格的字符串,而是存储一组字符串和整数。你不知道接下来会把哪一个放进去,但你并不一定关心那个;您只是利用用例的设置属性。

你可以做什么,而不只是创建一个存储大多数任何对象的集合。

Set<?> set = new HashSet<>();
for (Text val : values) {
    try {
        set.add(Double.valueOf(val.toString()).intValue());
    } catch (NumberFormatException nfe) {
        set.add(val.toString());
    }
}

当我们谈论使用异常作为控制流程时,这不是一件有吸引力的事情,但这会让你超越你的直接痛苦。

答案 2 :(得分:0)

目前,您使用一组字符串来存储数据。由于它是一组字符串,因此该集合将允许任何不相等字符串的元素。如果你正在编写一个不同的应用程序,你真的需要字符串相等,如果"1".equals("1.000")==true,那会不会让人感到困惑?

在这种情况下,我认为最好不要使用套装......

此函数应适用于任何数字或基于字符串的相等:

public boolean stringOrDoubleEqual(String a,String b){
    try{
       //Change the 0.001 to the acceptable error for your application.
       return Math.abs(Double.parseDouble(a)-Double.parseDouble(b))<0.001;
    }catch(NumberFormatException e){
       return a.equals(b);
    }
}

如果这符合您的使用案例,我相信其余部分应该是自然而然的:)