比较失败可以吗?

时间:2013-04-11 07:41:11

标签: java comparator

我有一个应用程序将一些文本文件转换为其他测试和csv文件(对于每3个文本文件,我生成一个文本文件和一个类似的csv文件)。它是根据compareTo方法命令一些阵营,文本文件和cvs文件之间的区别是我在文本文件中的区别,例如27个阵营和csv文件中只有25个,但其他信息是同样,我所看到的两个人也有一些顺序。

例如,我在原始文本文件中有:姓名,姓名,电话号码,邮政编码和一些识别。

在应用程序返回的文本文件中,我有:名称,姓氏,邮政编码和标识号。

在我拥有的csv文件中:姓名,邮政编码和身份证号码。

问题是我必须使用下一个代码重新排序邮政编码:

public int compareTo(Comunicado otro) {
    int cod1=Integer.parseInt(this.codigoPostal);
    int cod2=Integer.parseInt(otro.codigoPostal);
    if(this.codigoPostal.startsWith("28") && otro.codigoPostal.startsWith("28")==false)
        cod1=0;
    else if(this.codigoPostal.startsWith("08") && otro.codigoPostal.startsWith("08")==false)
        cod1=1;
    if(otro.codigoPostal.startsWith("28") && this.codigoPostal.startsWith("28")==false)
        cod2=0;
    else if(otro.codigoPostal.startsWith("08") && this.codigoPostal.startsWith("08")==false)
        cod2=1;
    if(this.codigoPostal.equalsIgnoreCase("00000")){
        cod1=2;
    }
    if(otro.codigoPostal.equalsIgnoreCase("00000")){
        cod2=2;
    }
    return cod1-cod2;
 }

我返回的两个文件是否有可能有不同的顺序?

我已经更改了我的代码,添加了下一行:

   public int compareTo(Comunicado otro) {
    int cod1=Integer.parseInt(this.codigoPostal);
    int cod2=Integer.parseInt(otro.codigoPostal);

    if(this.codigoPostal.startsWith("28") && otro.codigoPostal.startsWith("28")==false)
        cod1=0;
    else if(this.codigoPostal.startsWith("08") && otro.codigoPostal.startsWith("08")==false)
        cod1=1;
    if(otro.codigoPostal.startsWith("28") && this.codigoPostal.startsWith("28")==false)
        cod2=0;
    else if(otro.codigoPostal.startsWith("08") && this.codigoPostal.startsWith("08")==false)
        cod2=1;

    if(this.codigoPostal.equals(otro.codigoPostal))
    {
        if(this.codicoCliente.compareToIgnoreCase(otro.codicoCliente) == 0) 
        {
            return this.codicoCliente.compareToIgnoreCase(otro.codicoCliente);
        }
    }

    if(this.codigoPostal.equalsIgnoreCase("00000")){
        cod1=2;
    }
    if(otro.codigoPostal.equalsIgnoreCase("00000")){
        cod2=2;
    }
    return cod1-cod2;

 }

这足以确定没有问题吗?

最后我用下一个代码解决了我的问题:

    if(this.codigoPostal.startsWith("28") && otro.codigoPostal.startsWith("28")==false)
        cod1=0;
    else if(this.codigoPostal.startsWith("08") && otro.codigoPostal.startsWith("08")==false)
        cod1=1;
    if(otro.codigoPostal.startsWith("28") && this.codigoPostal.startsWith("28")==false)
        cod2=0;
    else if(otro.codigoPostal.startsWith("08") && this.codigoPostal.startsWith("08")==false)
        cod2=1;

    if(this.codigoPostal.equalsIgnoreCase("00000")){
        cod1=2;
    }
    if(otro.codigoPostal.equalsIgnoreCase("00000")){
        cod2=2;
    }

    if(this.codigoPostal.equals(otro.codigoPostal))

    {
        int i = this.codicoCliente.compareTo(otro.codicoCliente);
        if (i != 0) return i;
    }


    return cod1-cod2;


 }

1 个答案:

答案 0 :(得分:0)

有一件事(除非我误解了你的代码) - 如果两个邮政编码以相同的两位数字开头,那么你的compareTo说它们具有相同的排序。所以你可以用两个不同的顺序结束邮政编码。例如,08123和08321可能最终为:

08123
08321

08321
08123

理想情况下,如果你想避免这种情况,你的compareTo应该不能返回0。要测试这是否可以解决问题,请尝试:

return ((cod1-cod2)==0 ? (this.codigoPostal.compareTo(otro.codigoPostal)) : (cod1-cod2));

而不是你当前的return语句。注意我不是说这是很好的代码,我怀疑整个方法可以重构,但想看看是否能解决问题。