0

我有一个将一些文本文件转换为其他测试和 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;


 }
4

1 回答 1

0

一件事(除非我误解了您的代码)-如果两个邮政编码以相同的两位数字开头,那么您的 compareTo 表示它们具有相同的顺序。因此,您最终可能会以两种不同的顺序获得邮政编码。例如 08123 和 08321 最终可能是:

08123
08321

或者

08321
08123

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

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

而不是您当前的退货声明。注意我并不是说这是很好的代码,我怀疑整个方法可以重构,但想看看是否能解决问题。

于 2013-04-11T08:24:30.220 回答