0

我陷入了java抱怨比较方法错误的异常。

规则如下:我定义了一个名为 match 的类。想象一下搜索 2 个序列以找到相同的子字符串。如果存在 2 个相同的子字符串,则称其为匹配项。分数是子字符串的长度,seq1/2 开始/结束标记 2 个子字符串的开始和结束位置。目标是选择最长的子字符串匹配。如果两场比赛得分相同,我将选择两个序列中较早开始的一场比赛。否则,我通过使它们彼此相等来忽略其余部分。

这是错误的代码:

public class CompareMatch implements Comparator<match>{
    @Override
    public int compare(match o1, match o2) {
    if(o1.score>o2.score)   return -1;
    if ((o1.score==o2.score)&&((o1.seq1start<o2.seq1start)&&(o1.seq2start<o2.seq2start))) 
        return -1;
    if((o1.score==o2.score)&&!((o1.seq1start<o2.seq1start)&&(o1.seq2start<o2.seq2start)))
        return 0;
    return 1;
    }
}

匹配类也定义如下:

public class match {
    public int seq1start;
    public int seq1end;
    public int seq2start;
    public int seq2end;
    public int score;
    }

有人可以帮我找出比较逻辑的哪一部分是错误的吗?我一定是重叠了其中一个条件。谢谢

4

2 回答 2

1

像这样重写它怎么样?这种方式应该更清楚——首先比较重要的组件,然后比较不重要的组件。

另外,我认为,为了使函数遵守合同,你需要有一个传递排序条件,我认为你的想法不是那样的。

试试这个:

// first compare scores
if (o1.score>o2.score) return -1; /* higher score for o1 -> o1 */
if (o1.score<o2.score) return 1; /* higher score for o2 -> o2 */

// scores are equal, go on with the position
if (o1.seq1start+o1.seq2start < o2.seq1start+o2.seq2start) return -1; /* o1 is farther left */
if (o1.seq1start+o1.seq2start > o2.seq1start+o2.seq2start) return 1; /* o2 is farther left */

// they're equally good
return 0;
于 2013-03-31T20:57:28.643 回答
0

您的代码违反了以下API规则:

实现者必须确保所有 x 和 y 的 sgn(compare(x, y)) == -sgn(compare(y, x))

如果 compare(a,b) 在此处返回 -1:

if ((o1.score==o2.score) &&((o1.seq1start<o2.seq1start)&&(o1.seq2start<o2.seq2start))) 
    return -1;

然后 compare(b,a) 将在此处返回 0:

if((o1.score==o2.score)&&!((o1.seq1start<o2.seq1start)&&(o1.seq2start<o2.seq2start)))
    return 0;

这是违反规则的。

于 2013-03-31T21:00:26.270 回答