ArrayList上的Collections.sort()似乎没有正确排序

时间:2012-05-02 21:35:26

标签: java sorting arraylist floating-point nan

我正在尝试对TokenDoubleCounters(我的自定义对象)的ArrayList进行排序。在TokenDoubleCounter中,我已经实现了equals和compareTo,如下所示:

public class TokenDoubleCounter implements Comparable<TokenDoubleCounter> {
private String word;
private double count;

public boolean equals(Object o) {
    if (o instanceof TokenDoubleCounter) {
        TokenDoubleCounter other = (TokenDoubleCounter) o;
        if (other.word.equals(this.word) && other.count == this.count)
            return true;
    }
    return false;
}

public int compareTo(TokenDoubleCounter other) {
    double result = this.count - other.getCount();
    if (result > 0.0) 
        return 1;
    if (result < 0.0) 
        return -1;
    return this.word.compareTo(other.getWord());
}

    //rest of class omitted
}

在以下函数调用中创建和排序这些对象:

    public List<TokenDoubleCounter> chiSquareValueAll(int cl, int cl2) {
    List<TokenDoubleCounter> list = new ArrayList<TokenDoubleCounter>();

    for (String word : map.keySet()) {
                                                        //chiSquareValue2 returns a double
        list.add(new TokenDoubleCounter(word, chiSquareValue2(cl,cl2,word)));       
    }
    Collections.sort(list, Collections.reverseOrder());
    return list;
}

最后,迭代这些结果,我将这些写入文件:

    public boolean printChiSquare(PrintWriter out, int cl, int cl2) {
    for (TokenDoubleCounter tdc : this.chiSquareValueAll(cl,cl2)) {
        if (tdc.getCount() > 2.7) {
             //getWord() returns string value "word"  and getCount() returns double value "count"
            out.write(tdc.getWord() + "," + tdc.getCount() + "\n");

        }
    }
    return true;
}

结果对我来说有点令人惊讶,因为它们似乎不符合我要求的顺序:

  

字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,5.460792811839323
  字,4.746170542635659
  字,4.382692307692308
  字,4.382692307692308
  字,4.382692307692308
  字,4.382692307692308
  字,4.382692307692308
  字,4.382692307692308
  字,4.382692307692308
  字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,8.937254901960785
  字,5.460792811839323
  字,4.746170542635659
  字,4.746170542635659
  字,4.746170542635659
  字,4.382692307692308
  ...

我错过了什么?如果您需要其他详细信息,请与我们联系。

此外,我应该补充一点,所有条目“word”实际上都是不同长度的字符串等,但我不认为这是相关的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

试试这个:

public int compareTo(TokenDoubleCounter other) {
    int result = Double.compare(count, other.count);
    return result != 0 ? result : word.compareTo(other.word);
}

答案 1 :(得分:0)

比较器不必仅返回-1,0,1。您可以考虑使用计数之间的差异来创建幅度(如果这对您的数据有意义)。然后,项目应根据它们的相对顺序落实到位。

我认为你最终会得到一堆具有相同比较结果的项目,并且在这种情况下它们会保持插入顺序。