首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经济数据比较法的比较逻辑错误--比较法违反其一般合同

经济数据比较法的比较逻辑错误--比较法违反其一般合同
EN

Stack Overflow用户
提问于 2014-10-12 05:34:02
回答 1查看 71关注 0票数 0

我知道我的compareTo方法有些问题,但不确定在哪里..。

下面是我要整理的数据:

我正在查看许多.txt文件(每个大约20,000行),其中每一行都有一个数据点。我正在提取一个财政年度(格式化的YYYYqX,其中X是一个财政季度的1-4 )并将其存储为一个字符串。我还提取了一个行业代码(6位整数)和一个价格指数(存储为双)。它存储在DataPoint对象中。

我希望产出是三栏,一个是财政年度,一个是行业代码,一个是价格指数。我希望数据格式化,使财政年度(1991 q1,1991 q2,.,1992 q1等),行业代码排序至少达到最大值。因此,在财政年度一栏中,每个行业代码将有许多1991 q1条目,并在该季度有一个价格指数。然后,当1991 q1的所有行业代码都用完后,就会列出1991 q2的所有行业代码,等等。

为此,我按照以下方式构建了我的DataPoint compareTo方法:

代码语言:javascript
复制
public int compareTo(DataPoint p) {
    int fiscalResult = compareFiscal(p.getFiscalQuarter());
    if (fiscalResult > 0) {
        return fiscalResult;
    } else if (fiscalResult < 0) {
        return fiscalResult;
    } else {
        if (sectorCode > 0) {
            if (sectorCode > p.getSectorCode()) {
                return sectorCode - p.getSectorCode();
            }
            else if (sectorCode < p.getSectorCode()){
                return p.getSectorCode() - sectorCode;
            }
            else {
                return 0; // Should never happen
            }
        }
        else if (industryCode > 0) {
            if (industryCode > p.getIndustryCode()) {
                return industryCode - p.getIndustryCode();
            }
            else if (industryCode < p.getIndustryCode()) {
                return p.getIndustryCode() - industryCode;
            }
            else {
                return 0; // Should never happen
            }
        }
        // These should never be reached
        else if (p.getSectorCode() > 0) {
            return -1;
        }
        else if (p.getIndustryCode() > 0) {
            return -1;
        }
        else {
            return 0;
        }
    }
}

其中,compareFiscal(String)方法只是:

代码语言:javascript
复制
public int compareFiscal(String otherFiscal) {
    return fiscalQuarter.compareTo(otherFiscal);
}

fiscalQuarter是包含YYYYqX财政年度的字符串变量的名称。

当我前面提到行业代码时,实际上会有扇区代码(即四位整数)或行业代码(六位整数)。DataPoint不会两者兼有(它没有初始化为0),因此在compareTo方法中检查sectorCode或industryCode的值。

我可以在一个文件中对这些点进行排序,没有问题,但是在我的程序结束时,我从每个文件中获取所有数据点,并将它们放入一个新的ArrayList (两个列表,一个用于扇区代码,另一个用于行业代码)。在任何时候都不会将部门代码和行业代码排序在一起),并在此列表上调用Collections.sort。这就是抛出错误的关键所在。

这里有一点我试图调用Collections.sort方法(对于行业列表,一个相同的方法用于扇区列表)。DataList只是另一个表示一个文件的对象,包含两个列表,一个是扇区DataPoints,另一个是行业DataPoints。DataLists的列表只是从每个文件中创建了所有的DataLists。我不认为它说明了什么,但仅仅是为了相关性:

代码语言:javascript
复制
public static List<DataPoint> formatIndustryData(List<DataList> dataLists) {
    List<DataPoint> data = new ArrayList<>();
    for (DataList list : dataLists) {
        data.addAll(list.getIndustryPoints());
    }
    Collections.sort(data);
    return data;
}

有人能看到我的逻辑在compareTo方法中哪里出错了吗?

编辑:我忘了提到,如果财政年度不同,我们将永远不会得到一个与另一个行业相同的部门/行业代码。(例如,在同一财政年度,同一部门代码从来没有两个价格指数,因为这没有多大意义)。

此外,与具有扇区值的DataPoints相比,具有行业值的DataPoints在任何时候都不存在--它们存储在单独的列表中,并且只在彼此之间进行比较和排序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-12 05:48:45

你的逻辑似乎不完整。

如果sectorCode of this实例> 0,则按sectorCode进行比较,但不处理p.sectorCode <= 0的情况。

类似地,如果industryCode of this实例> 0,则按industryCode进行比较,但不处理p.industryCode <= 0的情况。

您应该决定这两个属性中的哪个-- sectorCode和industryCode --优先。

假设对象A有sectorCode 5和industryCode 0。对象B具有sectorCode 0和industryCode 6。

A.compareTo(B)返回1

B.compareTo(A)还返回1

这违反了compareTo的约定,因为A>B和B>A都不可能都是真的。

如果您想首先通过sectorCode进行比较,代码应该如下所示:

代码语言:javascript
复制
    if (sectorCode > 0) {
        if (sectorCode > p.getSectorCode()) {
            return 1;
        }
        else {
            return -1;
        }
    } else if (p.getSectorCode() > 0) {
        return -1;
    } else if (industryCode > 0) {
        if (industryCode > p.getIndustryCode()) {
            return 1;
        }
        else {
            return -1;
        }
    } else if (p.getIndustryCode() > 0) {
        return -1;
    } else {
        return 0; // Should never happen
    }

此外,如果industryCode == p.getIndustryCode() (两者均为正)或sectorCode == p.getSectorCode() (两者均为正),则应该返回0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26322215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档