【问题标题】:The method compare(MedicalShifts, MedicalShifts) in the type Comparator<MedicalShifts> is not applicable for the arguments (P, P)Comparator<MedicalShifts> 类型中的方法 compare(MedicalShifts, MedicalShifts) 不适用于参数 (P, P)
【发布时间】:2021-11-03 00:25:26
【问题描述】:

我正在尝试在通用数组上使用比较器,但它给了我以下错误

Comparator 类型中的方法 compare(MedicalShifts, MedicalShifts) 不适用于参数 (P, P)Java(67108979)

Main.java

public class Main {
    public static void main(String[] args) throws EmptyQueueException {
        Queue<MedicalShifts> queueHospital = new QueueImplement<>();
        queueHospital.add(new MedicalShifts("harry", 0));
        queueHospital.add(new MedicalShifts("hermione", 3));
        queueHospital.add(new MedicalShifts("ron", 1));
        queueHospital.add(new MedicalShifts("luna", 5));
        queueHospital.add(new MedicalShifts("voldemort", 8));
        System.out.println(queueHospital.peek());
        System.out.println(queueHospital.isEmpty());
        try {
            System.out.println(queueHospital.pop());
        } catch (EmptyQueueException emptyQueue) {
            System.out.println(emptyQueue.getMessage());
        }
        System.out.println(queueHospital.peek());
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
        queueHospital.add(new MedicalShifts("hagrid", 4));
        for (MedicalShifts shifts : queueHospital) {
            System.out.println(shifts);
        }
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
        queueHospital.sort();
        for (MedicalShifts shifts : queueHospital) {
            System.out.println(shifts);
        }
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
        System.out.println(queueHospital.min(new Comparator<MedicalShifts>() {
            @Override
            public int compare(MedicalShifts o1, MedicalShifts o2) {
                return o1.getNombre().compareTo(o2.getNombre());
            }
        }));
    }
}

QueueImplement.java

public class QueueImplement<P extends Comparable<P>> implements Queue<P> {
  private P[] elements;
  private static int INITIAL_DIM = 10;
  private int cantidad = 0;

  public QueueImplement() {
    P[] elements = (P[]) new Comparable[INITIAL_DIM]; // Creación de un array de elementos genéricos comparables
    this.elements = elements;
  }

  @Override
  public boolean add(P persona) throws EmptyQueueException {
    if (cantidad == elements.length) {
      throw new EmptyQueueException();
    }
    elements[cantidad++] = persona;
    return true;
  }

  @Override
  public P peek() {
    return elements[0];
  }

  @Override
  public P pop() throws EmptyQueueException {
    P first = elements[0];
    this.elements = Arrays.copyOfRange(elements, 1, elements.length); // si hay error, es - 1
    cantidad--;
    return first;
  }

  @Override
  public P min(Comparator<MedicalShifts> comp) {
    for (int i = 0; i < n-1; i++){
        for (int j = 0; j < n-i-1; j++){
             if (comp.compare(elements[j], elements[j+1]) > 0) {
                  P temp = elements[j];
                  elements[j] = elements[j+1];
                  elements[j+1] = temp;
             }
         }
    }
    return elements[0];
  }

  @Override
  public P max() { // devuelve el nombre mas grandajo. Se puede sortear y dsp agarrar el ultimo
    return elements[cantidad - 1];
  }

  @Override
  public void sort() {
    Arrays.sort(elements, 0, cantidad);
  }

  @Override
  public Iterator<P> iterator() {
    return new Iterator<P>() {
      private int index = 0;

      @Override
      public boolean hasNext() {
        return index < cantidad;
      }

      @Override
      public P next() {
        return elements[index++];
      }
    };
  }

  @Override
  public boolean isEmpty() {
    return cantidad == 0;
  }
}

错误发生在 min 函数中的 comp.compare 上。所有其他方法都适用于泛型,所以我不知道为什么它不适用于比较器的比较函数。

【问题讨论】:

  • 注意:您无需对事物进行排序即可找到最小值。您甚至可以在添加元素时跟踪您的最小值和最大值
  • 我需要按字母顺序找到名字最小的人,那就是海格,因为哈利会被流行音乐带走。
  • 我明白这一点,但您无需对任何内容进行排序即可获取该信息
  • 好吧,您至少知道我为什么会收到错误消息吗?以及如何获取信息?
  • 解决了,非常感谢

标签: java comparator


【解决方案1】:

您混合了通用类型和特定类型。您的 min 应该是 P 的通用名称(不是特定于 MedicalShifts 的)。你想要的

@Override
public P min(Comparator<P> comp) {
    for (int i = 0; i < n-1; i++){
        for (int j = 0; j < n-i-1; j++){
            if (comp.compare(elements[j], elements[j+1]) > 0) {
                P temp = elements[j];
                elements[j] = elements[j+1];
                elements[j+1] = temp;
            }
        }
    }
    return elements[0];
}

我不知道如何在 min 函数中进行排序。也许

@Override
public P min(Comparator<P> comp) {
    P m = null;
    for (int i = 0; i < n; i++){
        if (m == null || comp.compare(m, elements[i]) < 0) {
            m = elements[i];
        }
    }
    return m;
}

【讨论】:

  • 我现在收到此错误名称冲突:QueueImplement

    类型的方法 min(Comparator

    ) 与 Queue

    类型的 min(Comparator) 具有相同的擦除但不会覆盖它

  • 然后说: QueueImplement

    类型的方法 min(Comparator

    ) 必须重写或实现超类型方法

  • 顺便说一句,n 似乎从未在任何地方定义
  • 是的,我似乎在尝试修复时删除了该行
【解决方案2】:

Vos nos serás alumno mio no pibe? Ya te quiero ver en el oral :))))))

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多