【问题标题】:Comparator (int) in inner class内部类中的比较器(int)
【发布时间】:2016-02-01 20:21:44
【问题描述】:

比较器有问题。我用 2 个字段制作了非常简单的类,我需要为这两个字段制作带有比较器的内部类。

public class KlassA {

    private int i;
    private String tekst;  

    public int getI(){
        return i;

这个比较器工作正常。

   public static class KomparatorText implements Comparator<KlassA>{
        public int compare(KlassA a1, KlassA a2) {
            return a1.getTekst().compareTo(a2.getTekst());
        }

   }

在这个比较器中我有一些问题:“无法在原始类型 int 上调用 compareTo(int)”

   public static class KomparatorI implements Comparator<KlassA>{
        public int compare(KlassA a1, KlassA a2) {
            return a1.getI().compareTo(a2.getI());
        }
   }

我也尝试了 CompareTo,但是我需要实现字段或方法,但它不起作用

   public static class KomparatorI implements Comparable<KlassA>{

        private int i = this.i;

        public int compareTo(KlassA o) {
           if (this.i < o.i)
              return -1;
           else if (this.getI() == o.getI())
              return 0;
           else
              return 1;
       }
   }
}

我真的不知道如何解决它。我已经在搜索其他查询,但所有解决方案都不适用于我的示例。请帮忙。

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以像其他答案一样将所有内容强制为整数,但是,IMO,最好将您当前的类结构保留为整数并使用内置方法,Integer.compare()

    public static class KomparatorI implements Comparator<KlassA>{
       public int compare(KlassA a1, KlassA a2) {
          return Integer.compare(a1.getI(), a2.getI());
       }
    }
    

    同样,如果您希望使用 Comparable 代替,请使用它来节省输入(并避免逻辑错误):

    public static class KomparatorI implements Comparable<KlassA>{
       public int compareTo(KlassA o) {
          return Integer.compare(this.i, o.i);
       }
    }
    

    【讨论】:

    • 想加这个,但是你比我快
    • @user2610529 也经常发生在我身上,迟到了几分钟...... :-)
    • 非常感谢!就是这么简单但这么有用:)
    • 嗯,还有一个问题,当我将您的代码用于 compareTo 时: public static class KomparatorI2 implements Comparable{ public int compareTo(KlassA o) { return Integer.compare(this.i, o.i) ;我有消息:“我无法解析或不是一个字段”我需要制作字段:private int i;但它不会工作?
    • 实现 Comparable 的代码通常应该在实际的 KlassA 类中,并且可以访问o.i。但是,如果您在其他地方,请使用 o.getI() 来使用 public 方法。
    【解决方案2】:

    在 Java 中,intfloatboolean 等基本类型不是对应的 IntegerFloatBoolean 等对象。这意味着您不能在它们上调用方法。

    尝试使用,

    Integer.valueOf(this.i).compareTo(o.i);
    

    您的困惑可能来自编译器试图将原始类型自动转换为相应的对象类这一事实。在上面的示例中,参数o.i 会发生这种情况,它会自动转换为Integer。 尝试搜索“java autoboxing”。

    注意:在这种情况下,您实际上可以使用更好的Integer.compare(this.i, o.i)

    【讨论】:

      【解决方案3】:

      让我们看看你在这里痛风是什么

      a1.getI().compareTo(a2.getI());
      

      看起来 getI() 返回 int 而不是 Integer

      更改方法定义以返回Integer insteed,一切都会好起来的。所以在你的KlaasA

      public Integer getI(){ return i};

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多