我喜欢ex.array <- array(dim = c(3,3,3))
ex.array[,,1] <- c("N","A","","1","0","N","A","","1")
ex.array[,,2] <- c("0","N","A","","1","0","N","A","")
ex.array[,,3] <- c("1","0","N","A","","1","0","N","A")
desired.array <- array(dim = c(3,3,3))
desired.array[,,1] <- c(NA,NA,NA,1,0,NA,NA,NA,1)
desired.array[,,2] <- c(0,NA,NA,NA,1,0,NA,NA,NA)
desired.array[,,3] <- c(1,0,NA,NA,NA,1,0,NA,NA)
ex.array
desired.array
的新静态工厂方法,因为它们允许以非常简洁且不易出错的方式实现比较器。
但实施Comparator
的推荐方法是什么?我们应该在Comparable实现中使用Comparators吗?
Comparable
甚至使用静态比较器来减少对大型集合进行排序时的大量对象创建:
public MyClass implements Comparable<MyClass>{
...
public int compareTo(MyClass other){
Comparator<MyClass> naturalOrderComparator =
Comparator.comparing(MyClass::getFoo)
.thenComparing(MyClass::getBar);
return naturalOrderComparator.compare(this, other);
}
}
或者是否有另一种推荐的方法来实现Comparable with Java SE 8?
答案 0 :(得分:6)
您自己的选项2几乎肯定是目前最好的方式。它避免了分配,它读得很好 - 特别是如果你把静态常量放在compareTo
方法旁边。
Java 8中的新Comparator.comparing
工厂方法非常容易阅读,甚至更好,很难搞砸 - 有许多方法可以手动错误地编写比较,而不是我要记住,工厂方法对大多数人都免疫。尽管使用它们来编写compareTo
方法而不是Comparator
对象有点奇怪,但它仍然比替代方案更好。
答案 1 :(得分:1)
Pre-Java-8通常的最佳做法是使用Guava的ComparisonChain
和Ordering
实用程序。它们抽象出了正确实现.compareTo()
/ .compare()
方法的繁琐且容易出错的细节,并允许您编写一个人类可读的步骤序列来定义如何比较对象。 Ordering
实施Comparator
,但定义Ordering
并使用Comparable
的{{1}}方法调用它时没有任何问题。
请注意,由于在Java 8中添加了JDK,Ordering
被描述为已废弃:
如果你使用的是Java 8,那么这个类现在已经过时了......它的大多数功能现在由
Stream
和Comparator
本身提供,其余的现在可以被发现为静态新Comparators
课程中的方法。