0

我在 EarthquakeDataSet 类中有一个名为 public void mergeSort() 的方法,我在其中创建一个对象并尝试从我的 MergeSorter 类中调用 sort() 方法。MergeSorter 类本身不是我的代码,它是由其他人编写的,但我应该调用 sort() 并使用其他人编写的此类。我得到的确切错误是:“MergeSorter 类型中的方法 sort(E[],Comparator) 不适用于参数”

我在 EarthquakeDataSet 中的方法如下所示:

public void mergeSort(){
MergeSorter obj = new MergeSorter();
obj.sort();

}

我试图调用的 MergeSorter 中的方法调用了另一个方法,该方法也调用了另一个方法。这是我的 MergeSorter 课程。

MergeSorter 中的三个方法如下所示:

public static <E> void sort(E[] a, Comparator<? super E> comp) {
     mergeSort(a, 0, a.length - 1, comp); //calling mergeSort method
   }

private static <E> void mergeSort(E[] a, int from, int to, Comparator<? super E> comp){
}

private static <E> void merge(E[] a, int from, int mid, int to, Comparator<? super E> comp) {

}

里面有相当多的代码,但我只是在调用这些参数时遇到了麻烦。

4

4 回答 4

2

如您发布的错误消息和方法代码所示,该sort方法采用两个参数 - 首先是要排序的数组,其次是要定义排序的东西Comparator

您尝试sort()不带参数调用,这是不合法的,也不会编译。(即使它确实编译了 - 你希望它做什么?它究竟会排序什么?)

您可能需要更新自己的mergeSort方法以将要排序的数据作为参数。如果它是类中的一个字段,这可能不是必需的 - 但无论哪种方式,您都需要将该数据传递到MergeSorter.sort.

于 2013-10-09T15:39:03.470 回答
0

首先 MergeSorter 的 sort 方法是静态的,所以不需要创建对象来调用该方法,然后你调用的是 obj.sort(),它显然没有向签名为的方法传递任何参数

public static <E> void sort(E[] a, Comparator<? super E> comp)

您必须将两个参数传递给该方法,如示例

    class Try<E> implements Comparator<E>
   {
      public int compare(E o1, E o2) {
     //logic here
     }

  }

public class Test {

    static Try<String>[] a = new Try[5];

    public static void main(String[] args) {
        sort(a, new Try());
    }

    public static <E> void sort(E[] a, Comparator<? super E> comp)
    {
        //sort logic
    }

  }

我从 main 方法调用,在你的情况下你可以调用 MergeSorter.sort(a, new Try());

希望我清楚。

于 2013-10-09T15:54:19.090 回答
0

您将要分类的内容称为“记录”。通常,在对记录进行排序时,记录有多个数据项,但您希望对一个特定项目进行排序(例如按城市名称的字母顺序);或者有时是多个项目(例如,按城市名称的字母顺序,然后是同一城市的记录,按时间升序排列)。比较器看起来像这样:

EarthquakeRecord[] values = <whatever>;
obj.sort (values, new Comparator<EarthquakeRecord>() {
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) {
         return r1.getCity().compareTo (r2.getCity());
    });

或对多个项目进行排序:

obj.sort (values, new Comparator<EarthquakeRecord>() {
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) {
         int cityCompare = r1.getCity().compareTo (r2.getCity());
         if (cityCompare != 0)
             return cityCompare;
         return Integer.compare (r1.getTime(), r2.getTime());
             // assuming getTime() returns the time as an integer, somehow
    });

或者按降序排序:

obj.sort (values, new Comparator<EarthquakeRecord>() {
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) {
         return Double.compare (r2.getMagnitude(), r1.getMagnitude());
         // this will also work:
         // return -Double.compare (r1.getMagnitude(), r2.getMagnitude());
    });

如果第一个参数较小, compareandcompareTo方法返回一个负整数,如果第一个参数较大,则返回一个正整数,如果它们相等则返回 0。这就是sort.

于 2013-10-09T16:17:49.717 回答
0

你在打电话

obj.sort();

但是方法签名看起来像这样:

public static <E> void sort(E[] a, Comparator<? super E> comp)

你得到的错误是告诉你你使用了错误的参数,或者在这种情况下,你根本没有使用任何参数。

正确使用的示例如下:

String[] values = "Hello my name is chris".split(" ");
obj.sort(values, new Comparator<String>() {
    public int compare(String s1, String s2)
    {
         return s1.compareTo(s2);
    }
);
于 2013-10-09T15:41:02.013 回答