比较()中的空字段该怎么办?
在 Java 中,我使用一个类,其中某些字段可以为 null。 例如:
class Foo {
String bar;
//....
}
我想为这个类编写一个BarComparator,
private static class BarComparator
implements Comparator<Foo> {
public int compare( final Foo o1, final Foo o2 )
{
// Implementation goes here
}
}
是否有一个标准的方法来处理o1
,o2
,o1.bar中的任何一个
、o2.bar
可以为 null
,无需编写大量嵌套的 if
...else
?
干杯!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
将客户视为 POJO。我的答案是:
或者
Considering Customer as a POJO.My answer would be :
Or
我认为早期的 return 语句将是许多 if 的另一种选择
,例如
I think early return statements would be the other alternative to lots of ifs
e.g.
您不应该按照您的方式使用 NullComparator - 您正在为每个比较操作创建该类的新实例,并且如果您正在对包含 1000 个条目的列表进行排序,那么这将是 1000 * log2(1000) 对象完全是多余的。 这很快就会出现问题。
要么继承它,要么委托给它,或者简单地实现你自己的空检查 - 它实际上并不那么复杂:
You should not use the NullComparator the way you do - you're creating a new instance of the class for every comparison operation, and if e.g. you're sorting a list with 1000 entries, that will be 1000 * log2(1000) objects that are completely superfluous. This can quickly get problematic.
Either subclass it, or delegate to it, or simply implement your own null check - it's really not that complex:
您还可以使用 Spring 框架中的 org.springframework.util.comparator.NullSafeComparator 类。
示例(Java 8):
这将打印:
There is also the class
org.springframework.util.comparator.NullSafeComparator
in the Spring Framework you can use.Example (Java 8):
This will print:
您可以为其编写比较器。 假设您有一个 Person 类,其 String 名称作为私有字段。 getName() 和 setName() 方法来访问字段名称。 下面是 Person 类的比较器。
更新:
从 Java 8 开始,您可以使用以下 API 来获取列表。
You can write your Comparator for it. Lets say you have a class Person with String name as private field. getName() and setName() method to access the field name. Below is the Comparator for class Person.
Update:
As of Java 8 you can use below API's for List.
如果您使用的是 Google 集合,则可能会找到 比较器类很有帮助。 If 具有用于将 null 排序为集合中最大或最小元素的辅助方法。 您可以使用 复合比较器有助于减少代码量。
If you're using Google collections, you may find the Comparators class helpful. If has helper methods for ordering nulls as either the greatest or least elements in the collection. You can use compound comparators to help reduce the amount of code.
这里的关键是弄清楚您希望如何处理空值。 一些选项是: a) 假设 null 值按排序顺序出现在所有其他对象之前 b) 假设 null 值按排序顺序出现在所有其他对象之后 c) 将 null 视为相当于某个默认值 d) 将 null 视为错误条件。 您选择哪一个完全取决于您正在处理的应用程序。
当然,在最后一种情况下,您会抛出异常。 对于其他情况,您需要一个四路 if/else 情况(大约三分钟的编码时间,您就已经弄清楚了您想要的结果)。
The key thing here is to work out how you would like nulls to be treated. Some options are: a) assume nulls come before all other objects in sort order b) assume nulls come after all other objects in sort order c) treat null as equivalent to some default value d) treat nulls as error conditions. Which one you choose will depend entirely on the application you are working on.
In the last case of course you throw an exception. For the others you need a four-way if/else case (about three minutes of coding one you've worked out what you want the results to be).
这取决于您是否认为空条目是值得比较的有效字符串值。 为空 < 或> “苹果”。 我唯一可以肯定的是 null == null。 如果您可以定义 null 适合排序的位置,那么您可以适当地编写代码。
在这种情况下,我可能会选择抛出 NullPointerExcpetion 或 IllegalArgumentException,并尝试通过不首先将其放入比较中来在更高级别上处理 null。
It depends on whether you consider a null entry to be a valid string value worth of comparison. is null < or > "apple". The only thing I could say for sure is that null == null. If you can define where null fits into the ordering then you can write the code appropriately.
In this case I might choose to throw a NullPointerExcpetion or IllegalArgumentException and try to handle the null at a higher level by not putting it in the comparison in the first place.
我想您可以使用一个小的静态方法来包装对字段compareTo方法的调用,以对空值进行高或低排序:
简单用法(多个字段与通常一样):
I guess you could wrap the call to the field compareTo method with a small static method to sort nulls high or low:
Simple usage (multiple fields is as you would normally):
感谢您的回复! 通用方法和谷歌比较器看起来很有趣。
我发现有一个 NullComparator 在 Apache Commons Collections (我们当前正在使用) :
注意:我在这里重点关注了
bar
字段,以保持重点。Thanks for the replies! The generic method and the Google Comparators look interesting.
And I found that there's a NullComparator in the Apache Commons Collections (which we're currently using):
Note: I focused on the
bar
field here to keep it to the point.