-2

我想实现一个方法来比较我的接口的两个对象Task。由于只有严格的偏序,当且仅当两个对象不可比较时才应该返回。TaskpartialCompareTonull

如果您对严格偏序的概念感到困惑,请查看: https ://en.wikipedia.org/wiki/Partially_ordered_set

动机:有些任务会受到限制,即必须在另一项任务之前或之后完成。然后将其用于对任务进行拓扑排序,即以满足所有约束的方式排列它们。

Task a对于and的任何实例,它应该具有以下属性b

  • 如果a.partialCompareTo(b) != null那么sgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
  • 如果a.partialCompareTo(b) = null那么b.partialCompareTo(a) = null

注意:我不能使用标准库的接口,因为Task:在returnComparable中没有总排序,所以如果两个对象是incomparable ,就没有足够的结果。特别是会有 Task 的实现,其中实现的实例永远不能相互比较(但可能与Task 的其他子类的实例相比较,这些实例覆盖)。compareToComparableint partialCompareTo

这个想法是使用partialCompareTo参数的方法,如果它覆盖了类中指定的方法Task

下面的方法实际上更像是一个玩笑而不是实际的尝试,因为每次比较两个不可比较的对象时,我们都会得到一个 StackOverflowError (它被捕获,但无论如何这是不可行的):

public class Task implements TopologicalComparable<Task> {

    /*
     * other code
     */

    @Override
    public Integer partialCompareTo(Task other) {
        Integer result;
        try {
            result = - other.partialCompareTo(this);
        } catch (StackOverflowError | NullPointerException e) {
            return null;
        }
        return null;
    }

}

以下实现显然更好,但它有一个缺点,即总是必须覆盖辅助方法overridesDefaultPartialCompareTo

public class Task implements TopologicalComparable<Task> {

    /*
     * other code
     */

    @Override
    public Integer partialCompareTo(Task other) {
        if (other.overridesDefaultPCompareTo()) {
            Integer revComp = other.overridesDefaultPartialCompareTo(this);
            if (revComp != null) {
                return - revComp;
            }
        }
        return null;
    }

    public default boolean overridesDefaultPartialCompareTo() {
        return false;
    }

}

有没有办法问,方法是否在代码中被覆盖?

还是有其他方法可以解决我的问题?

4

2 回答 2

0

当您比较事物时,您应该使用 duffymo 推荐的具有可比较界面的东西。更详细地说,您应该将项目保存在 ArrayList 中,然后覆盖 compare 方法。我不确定您为什么要使用 pCompare,但我假设您不了解继承和多态性。而不是更改您的比较名称,您应该使用扩展,这里是有关继承的文档,请阅读它们。看起来您的语法很好,但是您对 java 代码的编写方式的理解并不好。那么你应该怎么做呢?

让我们从我认为错误的第一件事开始(如果这不正确,请随时纠正我)你没有正确使用界面。接口适用于声明全局变量、帮助您实现设计模式等。大多数人说这是行为契约。用简单的英语使用界面来帮助您克服Multiple Inheritance。我不知道您为什么要使用它以及您打算用它做什么,但我从未向已实现的接口添加方法。

接下来是你重命名你的 pCompareTo我从来没有这样做过,我帮助制作了一些相当大的程序。我真的不认为这是一个好的编程。它应该在课堂上。使用它的类很好,尽管并非总是如此,而且我很难思考如何解释它,所以你可能需要做一些研究。

当您摆脱接口时,将 compareTo() 放在正确的位置(不要将其更改为不良编程的 pCompareTo()),然后像以前那样覆盖它,并指定其中的内容。注意这很重要通常当你覆盖一个比较时,你有 compareTo 方法,如果传入的对象小于它正在比较的对象,则返回 -1,如果它更大,则返回 1,如果相同,则返回 0尺寸。如果你只想检查它是否相等,那么你可以简单地检查它们是否相等,就像你做的字符串一样

string1.equals(string2)

如果为真则返回 1,如果为假则返回 0。

 @Override
public default Integer pCompareTo(Task other) {
    Integer result;
    try {
        result = - other.pCompareTo(this);
    } catch (StackOverflowError | NullPointerException e) {
        return null;
    }
    return null;
}

好吧,这是大错特错的人,只是大错特错。你的方法是pCompareTo()对吗?您在其内部调用它(这称为递归,我不建议您现在使用它)。我不知道你在比较什么(你也不需要 try catch 但如果你愿意的话可以,try catch 就像你在代码中设置的一个陷阱,如果该特定区域不能正常工作,它就会消失),但如果它们是整数,你会做类似的事情

@Override
public int compareTo(Integer other){
 if (this < other) {
  return 1;
 }
 if (this > other) {
  return -1;
 }
 return 0;

请参阅覆盖说明。在这篇已经很长的帖子中,我要向您解释它是如何工作的。祝你好运,我在编程中的建议语法并不是很重要。知道如何正确编程更为重要。

于 2016-03-05T17:26:55.200 回答
0

修订版稍微好一点,也更有意义。谢谢你。现在开始您需要了解您正在比较对象。如果您想编写一个 compareTo() 方法,您需要考虑“我在比较什么”。为了让您编写您的方法,您需要向我们解释您正在比较的内容,在您的脑海中,您可能正在比较一组元素。但是在编程世界中,您正在比较整数、字符串或 w/e 您制作它们。所以我问你,你在比较什么?你应该做一个你正在比较的 w/e 类,比如说

class POsetElement{...
//make some sort of set element object
}

在此类中,您希望像这样实现可比较的,

class POsetElement implements comparable{...
//make some sort of set element object...

//then make w/e other methods you need...

//now use compareTo() override
@override
compareTo(){
//make your custom method
}
}

请注意我是如何将 compareTo() 方法 放在POsetElement类中的。Java是面向对象的。这意味着面向对象的编程。您需要自定义构建对象。你需要创造你自己的世界,创造你自己的对象。我无法向你解释这一切。请付出一些努力并学习更多Java编程。您还需要了解我会说这些是一些非常基本的东西,我将再次重申您需要阅读一些有关 Java 基础知识的内容。祝你好运。

于 2016-03-05T19:10:07.377 回答