我需要编写一个名为search的方法,该方法以属性(在我的情况下为Value)和单个对象的升序中获取对象数组。如果在数组中找到给定对象,则使用我创建的compareTo来回答。
我很难想到如何做到这一点。
我确实知道java.util.Arrays;
某处的某个方法,我尝试了Arrays.sort(_traesure);
,但这会导致错误:Treasure cannot be cast to java.lang.Comparable
我想是因为它不知道它的排序方式。
我需要按其value属性的升序传递一个对象数组。
我看过很多关于比较者的帖子,但我不太确定他们是/做什么的?
有人能指出我正确的方向。
答案 0 :(得分:1)
Comparable in Java是一个告诉Java的接口,“它有一个compareTo函数”。根据您的上下文,您似乎想要排序public class Treasure
之类的内容。您需要将其更改为public class Treasure implements Comparable<Treasure>
- 有关详细信息,请参阅the Comparable docs。
实现此功能需要您创建一个compareTo(Treasure other)
函数,该函数将让Arrays了解如何对Treasure对象进行排序。
示例代码:
public class Treasure implements Comparable<Treasure> {
private int value;
public Treasure(int value) { this.value = value; }
public int compareTo(Treasure other) { return Integer.compare(value, other.value); }
如果您希望使用需要比较值的集合函数,则需要创建比较器 - 如@kha的答案。实现可比较 - 如上所述 - 为您的班级提供一个公共比较器,无论它在哪里,在某些情况下可以说更有用。在你的情况下,你可以走任何一条路并且开心。
答案 1 :(得分:0)
来自
的javadocpublic static void sort(Object[] a)
方法 -
“根据元素的自然顺序,将指定的对象数组按升序排序。数组中的所有元素都必须实现Comparable接口。此外,数组中的所有元素必须是可相互比较的(即e1) .compareTo(e2)不得为数组中的任何元素e1和e2抛出ClassCastException。“
你可以在这里阅读更多相关信息 - &gt; http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(java.lang.Object[])
就像我在评论中所说的,看起来你传递给你方法的数组包含的元素没有自然顺序,即它们没有实现Comparable接口。
以下是您的示例方法声明。
public <K extends Comparable<? super K>> boolean search(K[] values, K key){
}
我个人认为搜索不是一个好的方法名称。我认为'发现'会更好。
那就是说,你可能想在这里阅读Comparable界面 - &gt; http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
使用泛型将强制传递给方法的数组包含具有自然总顺序的元素,即它们实现Comparable接口。
另请注意,Comparable接口的javadoc说明如下。
“强烈建议(尽管不是必需的)自然排序与equals一致。这是因为没有显式比较器的有序集(和有序映射)在与元素(或键)一起使用时表现得很”奇怪“自然排序与equals不一致。特别是,这样的有序集(或有序映射)违反了set(或map)的一般契约,它是根据equals方法定义的。“
因此您可能还想阅读equals和hashCode方法。下面给出了equals方法的javadoc链接。 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)