我想实现一个比较我的接口的两个对象的方法 Task
.因为Task
上只有一个严格的偏序,partialCompareTo
应该返回null
当且仅当两个对象不可比时。
如果您对严格部分排序的概念感到困惑,请查看以下内容:https://en.wikipedia.org/wiki/Partially_ordered_set
动机:某些任务将具有必须在另一个任务之前或之后完成的约束。然后,这用于对任务进行拓扑排序,即以满足所有约束的方式排列它们。
对于任何Task
a
和b
实例,它应具有以下属性:
- 如果是
a.partialCompareTo(b) != null
,则sgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
- 如果
a.partialCompareTo(b) = null
则b.partialCompareTo(a) = null
注意:我不能使用标准库的接口Comparable
,因为 Task:compareTo
在 Comparable
返回int
时不会有总排序,所以如果两个对象无法比较,则无法获得足够的结果。特别是会有 Task 的实现,其中该实现的实例永远不会相互比较(但可能与 Task 的其他子类的实例相当,这些子类覆盖了 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;
}
}
有没有办法问,该方法是否在代码中被覆盖?
或者有没有其他方法来解决我的问题?
当你比较东西时,你应该使用Duffymo推荐的具有类似界面的东西。为了详细说明,您应该将项目保留在 ArrayList 中,然后覆盖比较方法。我不确定你为什么有pCompare,但我假设你不了解继承和多态性。与其更改比较的名称,不如使用扩展,这里有关于继承的文档,请阅读它们。看起来你的语法很好,但你对java代码如何编写的理解并不好。那么你应该怎么做呢?
让我们从我认为错误的第一件事开始(如果这是不正确的,请随时纠正我)您没有正确使用界面。接口适用于声明全局变量、帮助您实现设计模式等。大多数人说这是一种行为契约。用简单的英语来说,使用界面来帮助您克服多重继承。我不知道你为什么要使用一个以及你打算用它做什么,但我从未向实现的接口添加方法。
接下来的事情是你重命名你的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;
请参阅覆盖说明。在这篇已经很长的帖子中向您解释它是如何工作的,对我来说很重要。祝你好运,我在编程中的建议语法不是很重要。知道如何正确编程更为重要。
修订版稍微好一点,更有意义。谢谢你。现在要开始,您需要了解您正在比较对象。如果你想写一个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() 方法 PUT 在 POsetElement 类中。 Java 是 OOP。这意味着面向对象的编程。您需要自定义构建对象。你需要创造自己的世界,创造自己的对象。我无法向你解释这一切。请付出一些努力,学习更多的Java编程。你还需要明白,我会说这些是一些非常基本的东西,我会再次重申你需要阅读一些关于java基础知识的知识。祝你好运。