我想实现一个比较我的界面Task
的两个对象的方法。由于Task
上只有严格的部分排序,partialCompareTo
当{且仅当两个对象无法比较null >
如果您对严格的部分排序的概念感到困惑,请查看以下内容: https://en.wikipedia.org/wiki/Partially_ordered_set
动机:某些任务将具有必须在另一个任务之前或之后完成的约束。然后将其用于topological sort任务,即以满足所有约束的方式排列它们。
对于Task
a
和b
的任何实例,它应具有以下属性:
a.partialCompareTo(b) != null
则sgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
a.partialCompareTo(b) = null
则b.partialCompareTo(a) = null
注意:我无法使用标准库的Comparable
接口,因为任务上没有总排序:{{1 } compareTo
中的{}返回Comparable
,因此如果两个对象无法比较,则无法获得足够的结果。特别是将会有Task的实现,其中实现的实例从不可比较彼此(但可能与其他实例相当任务的子类,覆盖 int
)。
如果它覆盖了类partialCompareTo
中指定的方法,则使用参数的partialCompareTo
方法。
以下方法实际上更多的是一个笑话而不是实际尝试,因为每次比较两个不可比较的对象时,我们得到一个StackOverflowError(被捕获,但无论如何这是不可行的):
Task
以下实现显然更好,但它有缺点,总是必须覆盖辅助方法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
有没有办法在代码中询问方法是否被覆盖?
或者是否有其他方法可以解决我的问题?
答案 0 :(得分:0)
当你比较的东西时,你应该使用duffymo推荐的具有类似界面的东西。要详细说明,您应该将项目保留在ArrayList中,然后覆盖compare方法。我不确定为什么你有pCompare,但我会假设你不了解继承和多态。您应该使用扩展,而不是更改比较的名称,这里有关于继承的documents,请阅读它们。看起来你的语法很好,但你对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()对吗?你在里面调用它(这叫做递归,我不建议你现在使用它)。我不知道你在比较什么(也是你不需要尝试捕获,但是如果你想,可以尝试捕获就像你在代码中设置的陷阱,如果特定区域没有工作正常),但如果他们是整数你会做类似的事情
@Override
public int compareTo(Integer other){
if (this < other) {
return 1;
}
if (this > other) {
return -1;
}
return 0;
请参阅override说明。对于我来说,在这个已经很长的帖子中解释它是如何工作的。祝你好运,我在编程中的建议语法并不是很重要。知道如何正确编程更为重要。
答案 1 :(得分:0)
修订版略胜一筹,更有意义。谢谢你。现在开始,您需要了解您正在比较对象。如果您想编写compareTo()方法,您需要考虑“我在比较什么”。为了编写您的方法,您需要向我们解释您要比较的内容,在您的脑海中,您可能会比较一组中的元素。但是在编程世界中,你正在比较整数,字符串或w / e。所以我问你,你在比较什么?你应该做一个与你比较的w / e,比如说
class POsetElement{...
//make some sort of set element object
}
在本课程中,您希望implement comparable喜欢这样,
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()方法 INSIDE 放在POsetElement类中。 Java是OOP。这意味着面向对象的编程。您需要自定义构建对象。你需要创建自己的世界,创建自己的对象。我无法向你解释所有这些。请付出一些努力,学习更多java编程。另外你需要理解我会说这些是一些非常基本的东西,我将再次重申你需要阅读一些关于java基础知识的内容。祝你好运。