java compare null_java – 如何简化一个null安全的compareTo()实现?

我实现compareTo()方法为一个简单的类,这样(以便能够使用Collections.sort()和其他好处提供的Java平台):

public class Metadata implements Comparable {

private String name;

private String value;

// Imagine basic constructor and accessors here

// Irrelevant parts omitted

}

我希望这些对象的自然排序是:1)按名称排序,2)如果名称相同,按值排序;两个比较应该不区分大小写。对于这两个字段,null值是完全可以接受的,因此compareTo在这些情况下不能中断。

想到的解决方案是沿着以下线(我在这里使用“保护子句”,而其他人可能更喜欢一个单一的返回点,但这是在点):

// primarily by name, secondarily by value; null-safe; case-insensitive

public int compareTo(Metadata other) {

if (this.name == null && other.name != null){

return -1;

}

else if (this.name != null && other.name == null){

return 1;

}

else if (this.name != null && other.name != null) {

int result = this.name.compareToIgnoreCase(other.name);

if (result != 0){

return result;

}

}

if (this.value == null) {

return other.value == null ? 0 : -1;

}

if (other.value == null){

return 1;

}

return this.value.compareToIgnoreCase(other.value);

}

这做的工作,但我不是完全满意这个代码。诚然,它不是很复杂,但是相当冗长和乏味。

问题是,你将如何使这更少冗长(同时保留功能)?如果他们帮助,请随意参考Java标准库或Apache Commons。将这个(一点)更简单的唯一选项是实现我自己的“NullSafeStringComparator”,并应用它来比较这两个字段?

编辑1-3:Eddie的权利;固定“两个名称都为null”上面的情况

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAS(Compare and Swap)队列是一种基于无锁的并发编程实现,其核心思想是利用原子操作的特性来实现线程安全的数据访问。下面是用Java实现一个简单的CAS队列的示例代码: ```java import java.util.concurrent.atomic.AtomicReference; public class CASQueue<T> { private AtomicReference<Node<T>> head; private AtomicReference<Node<T>> tail; public CASQueue() { Node<T> dummy = new Node<>(null); head = new AtomicReference<>(dummy); tail = new AtomicReference<>(dummy); } public void enqueue(T item) { Node<T> newNode = new Node<>(item); while (true) { Node<T> curTail = tail.get(); Node<T> tailNext = curTail.next.get(); if (curTail == tail.get()) { if (tailNext != null) { tail.compareAndSet(curTail, tailNext); } else { if (curTail.next.compareAndSet(null, newNode)) { tail.compareAndSet(curTail, newNode); return; } } } } } public T dequeue() { while (true) { Node<T> curHead = head.get(); Node<T> curTail = tail.get(); Node<T> headNext = curHead.next.get(); if (curHead == head.get()) { if (curHead == curTail) { if (headNext == null) { return null; } tail.compareAndSet(curTail, headNext); } else { T item = headNext.item; if (head.compareAndSet(curHead, headNext)) { return item; } } } } } private static class Node<T> { private T item; private AtomicReference<Node<T>> next; public Node(T item) { this.item = item; this.next = new AtomicReference<>(null); } } } ``` 这个队列中的每个节点都包含一个元素和一个指向下一个节点的引用。队列的头部和尾部都是用AtomicReference来保证线程安全。enqueue方法中,我们首先创建一个新的节点,然后利用CAS操作来将其添加到队列的尾部。如果队列的尾部发生了变化,我们需要再次尝试添加节点。dequeue方法中,我们利用CAS操作来将队列的头部指针向前移动,并返回移除的元素。如果队列为空,则返回null

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值