如何创建2取决于java中的Comparators?

时间:2016-01-10 12:51:06

标签: java sorting interface comparator

假设我有一个Java this.source.connect(this.filter); // Filter set to eq value 200 this.source.connect(this.convolver); this.source.connect(this.dry); this.convolver.connect(this.wet); // Convolver is the actual convolver this.filter.connect( context.destination ); this.dry.connect(context.destination); // Dry is a gain (at 1) this.wet.connect(context.destination); // Wet is a gain (at 1) 类和2 Product s:

  1. 第一个是asc订单的价格Comparator
  2. 第二个是desc订单的价格Comparator
  3. 如果我将第1个更改为产品名称Comparator,那么,第2个也会自动更改为名称Comparator吗?

    非常感谢!

    〔实施例:

    Comparator

    因此,如果我将第一个比较器更改为按名称排序,而不是按价格排序,则第二个也会改变,但不会相反!

2 个答案:

答案 0 :(得分:1)

一种方法是:

import java.util.*;

class SomeClass {
  public int price;
  public String name;
  public SomeClass(String name, int price) {
    this.name = name;
    this.price = price;
  }
}

class PriceOrNameComparator implements Comparator<SomeClass> {

  boolean compareByPrice;

  public PriceOrNameComparator byPrice() {
    this.compareByPrice = true;
    return this;
  }

  public PriceOrNameComparator byName() {
    this.compareByPrice = false;
    return this;
  }

  public int compare(SomeClass a, SomeClass b) {
    if (compareByPrice) {
      return a.price - b.price;
    } else {
      return a.name.compareTo(b.name);
    }
  }

  public Comparator<SomeClass> reverseComparator() {
    return new Comparator<SomeClass>() {
      public int compare(SomeClass a, SomeClass b) {
        int res = PriceOrNameComparator.this.compare(a, b);
        if (res == 0) {
          return 0;
        } else {
          return (res > 0) ? -1 : 1;
        }
      }
    };
  }
}

class Test {
  public static void main(String[] args) {
    SomeClass s1 = new SomeClass("a", 5);
    SomeClass s2 = new SomeClass("b", 4);
    PriceOrNameComparator c = new PriceOrNameComparator().byPrice();
    Comparator<SomeClass> r = c.reverseComparator();
    System.out.println(c.compare(s1, s2)); // 1
    System.out.println(r.compare(s1, s2)); // -1
    c.byName();
    System.out.println(c.compare(s1, s2)); // -1
    System.out.println(r.compare(s1, s2)); // 1
  }
}

基本上,外部比较器是可配置的,而内部,反向顺序比较器是一个匿名内部类,它具有对外部比较器的隐式引用,并且可以观察其状态的变化。

答案 1 :(得分:1)

我建议只有一个比较器类用于按价格比较,一个单独的比较器类按名称进行比较(或没有类 - 请参阅我的答案结尾)。每个班级做一件事,做得很好。

然后你可以使用Comparator.reversed默认方法反转任何比较器......同样你可以使用Comparator.thenComparing将它们链接在一起,如果你想按名称和那么价格,例如:

Comparator<Product> nameThenPrice =
    new NameComparator().thenComparing(new PriceComparator());

(如果您没有使用Java 8,那么编写一个ReversingComparator就可以轻松写入现有版本,而CompoundComparator则需要两个现有版本。“

您还可以在Comparator中使用Java 8的静态方法:

Comparator<Product> byName = Comparator.comparing(p -> p.getName());
Comparator<Product> byPrice = Comparator.comparing(p -> p.getPrice());
Comparator<Product> nameThenPrice = byName.thenComparing(byPrice);

通过这种方式,您通常无需手动实现Comparator