【问题标题】:Comparator using a String field of my class for comparison?比较器使用我班级的字符串字段进行比较?
【发布时间】:2011-10-16 22:17:18
【问题描述】:

我有一个 A 类型的对象列表,我必须为 A 的一个字段排序它,它是 String 类型的。

public class A{
    public String field1;
    public Integer field2;
    ...
}

如果我必须订购 int 字段,我会这样做:

Collections.sort(listOfA, new Comparator<A>() {
        public int compare(A p1, A p2) {
            return p1.field2 - p2.field2);
            }
        });

但不幸的是需要按String类型的字段排序。

我该怎么做?

【问题讨论】:

  • compareTo 方法中使用减法通常很危险,因为整数溢出。请改用 Google Guava 中的Ints.compare
  • @Roland 或只是 &gt; =&lt;
  • 是的,但在&lt;=&gt; 的情况下,您必须明确说明运算符和结果。我发现写return Ints.compare(a, b) 更容易。

标签: java string comparator


【解决方案1】:

你可以使用字符串compareTo

【讨论】:

    【解决方案2】:
        public int compare(A p1, A p2) {
            return p1.field2.compareTo( p2.field2) );
            }
    

    【讨论】:

    • 而A类必须实现Comparable接口
    【解决方案3】:

    或者你的类可以实现接口Comparable,像这样

    public class A implements Comparable<A> {
      public String field1;
      public Integer flied2;
    
        public int compareTo(A o) {
            return this.field1.compareTo(o.field1);
        }
    
    }
    

    这会让你

    Collections.sort(listofA);
    

    如果 A 总是按字段 1 排序,那么哪个 IMO 更可取/更干净。

    【讨论】:

      【解决方案4】:

      不过是旧线程。
      使用 java 8,您现在拥有 lambda:

      listOfA.sort((a,b) -> a.field1.compareTo(b.field1));
      

      另外,如果有一个用于 field1 的吸气剂,可能应该有一个吸气剂,那么你也可以这样做

      listOfA.sort(Comparator.comparing(A::getFieldOne));
      

      如果你没有getter,还有这个:

      listOfA.sort(Comparator.comparing(a -> a.field1));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 2011-03-20
        相关资源
        最近更新 更多