假设我有一个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:
Comparator
。Comparator
。如果我将第1个更改为产品名称Comparator
,那么,第2个也会自动更改为名称Comparator
吗?
非常感谢!
〔实施例:
Comparator
因此,如果我将第一个比较器更改为按名称排序,而不是按价格排序,则第二个也会改变,但不会相反!
答案 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
。