我知道我的compareTo方法有些问题,但不确定在哪里..。
下面是我要整理的数据:
我正在查看许多.txt文件(每个大约20,000行),其中每一行都有一个数据点。我正在提取一个财政年度(格式化的YYYYqX,其中X是一个财政季度的1-4 )并将其存储为一个字符串。我还提取了一个行业代码(6位整数)和一个价格指数(存储为双)。它存储在DataPoint对象中。
我希望产出是三栏,一个是财政年度,一个是行业代码,一个是价格指数。我希望数据格式化,使财政年度(1991 q1,1991 q2,.,1992 q1等),行业代码排序至少达到最大值。因此,在财政年度一栏中,每个行业代码将有许多1991 q1条目,并在该季度有一个价格指数。然后,当1991 q1的所有行业代码都用完后,就会列出1991 q2的所有行业代码,等等。
为此,我按照以下方式构建了我的DataPoint compareTo方法:
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)方法只是:
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。我不认为它说明了什么,但仅仅是为了相关性:
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在任何时候都不存在--它们存储在单独的列表中,并且只在彼此之间进行比较和排序。
发布于 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进行比较,代码应该如下所示:
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。
https://stackoverflow.com/questions/26322215
复制相似问题