【问题标题】:Sorting an array of objects is tricky对对象数组进行排序很棘手
【发布时间】:2015-03-27 22:59:54
【问题描述】:

我需要编写一个名为 search 的方法,该方法以属性(在我的情况下为值)和单个对象的升序获取对象数组。如果在数组中找到给定的对象,则使用我创建的 compareTo 来回答。

我很难考虑如何做到这一点。

我知道 java.util.Arrays; 肯定有一个方法,我试过 Arrays.sort(_traesure); 但这会导致错误:Treasure cannot be cast to java.lang.Comparable 我想是因为它不知道它的排序依据。

我需要按其 value 属性的升序传递一组对象。

我看过很多关于 Comparator 的帖子,但我不太确定它们是什么/做什么?

谁能指出我正确的方向。

【问题讨论】:

标签: java arrays object


【解决方案1】:

Java 中的 Comparable 是一个接口,它告诉 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 的答案)。实现 Comparable——如上所述——给你的类一个公共的比较器,无论它走到哪里,这在某些情况下可以说是更有用的。在你的情况下,你可以选择任何一种方式并快乐。

【讨论】:

    【解决方案2】:

    来自javadoc的

    public static void sort(Object[] a) 
    

    方法--

    "将指定的对象数组按照其元素的自然顺序升序排序。数组中的所有元素都必须实现Comparable接口。此外,数组中的所有元素必须是相互可比的(即e1 .compareTo(e2) 不得为数组中的任何元素 e1 和 e2 抛出 ClassCastException。"

    您可以在此处阅读更多相关信息 --> http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

    就像我在 cmets 中所说的那样,您传递给方法的数组似乎包含没有自然顺序的元素,即它们没有实现 Comparable 接口。

    这是一个示例方法声明。

    public <K extends Comparable<? super K>> boolean search(K[] values, K key){
    }
    

    我个人认为搜索不是一个好的方法名称。我认为“找到”会更好。

    也就是说,您可能想在此处阅读有关 Comparable 接口的信息--> http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

    使用泛型将强制您传递给方法的数组包含具有自然总顺序的元素,即它们实现 Comparable 接口。

    另请注意,Comparable 接口的 javadoc 说明如下。

    “强烈建议(尽管不是必需的)自然排序与 equals 一致。这是因为没有显式比较器的排序集(和排序映射)在与元素(或键)一起使用时表现“奇怪”自然排序与equals不一致。特别是这样的排序集(或排序映射)违反了集合(或映射)的一般约定,它是根据equals方法定义的。”

    因此,您可能还想了解 equals 和 hashCode 方法。下面给出的是 equals 方法的 javadoc 的链接。 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 2011-08-18
      • 1970-01-01
      • 2020-07-11
      • 2015-03-04
      相关资源
      最近更新 更多