有人可以帮助将这个简短的Java函数解构成简单的英语吗?

问题描述

我正在尝试将PriorityQueue类从OpenJDK implementation移植到另一种没有类似数据结构的语言(Xojo)。我真的很努力将以下方法分解为伪代码,以便将其翻译为Xojo:

public E poll() {
  final Object[] es;
  final E result;

  if ((result = (E) ((es = queue)[0])) != null) {
    modCount++;
    final int n;
    final E x = (E) es[(n = --size)];
    es[n] = null;
    if (n > 0) {
      final Comparator<? super E> cmp;
      if ((cmp = comparator) == null)
        siftDownComparable(0,x,es,n);
      else
        siftDownUsingComparator(0,n,cmp);
      }
    }
    return result;
}

变量queue是在类上定义的Object[]数组。

有几行让我感到困惑。首先:

if ((result = (E) ((es = queue)[0])) != null)

这是否意味着“将数组queue分配给变量es并访问元素0,如果为空,则执行以下操作?” result = (E)表达式是什么意思?我知道E是通用类型。

final E x = (E) es[(n = --size)];的操作顺序是什么?这是否意味着递减size,将该值分配给n,然后访问es数组中的该索引?如果是这样,此表达式前的x = (E)是什么意思?我猜这意味着将元素转换为类型E

最后,这些行:

final Comparator<? super E> cmp;
if ((cmp = comparator) == null)

comparator一个类变量(持有Comparator)。为什么将其分配给局部变量cmp,问号在第一行表示什么?

解决方法

1- "hello"
首先,它将数组if ((result = (E) ((es = queue)[0])) != null)分配给变量queue,并从中获取元素es,将其强制转换为0泛型类型,并将其分配给E,然后检查如果result不为空。

2- result
首先Java求值final E x = (E) es[(n = --size)];,然后将其赋给int类型--size,然后从n数组中获得n,将其强制转换为es,然后将其赋给变量{ {1}}。


我认为您要求的下两行现在很清楚! ,

让我看看能不能帮忙:

if ((result = (E) ((es = queue)[0])) != null)

上面的意思是“将queue分配给es,访问索引0,将其强制转换为类型E,将其分配给result,如果是,则执行以下操作不为空”。

final E x = (E) es[(n = --size)];

这意味着“从size中减去一个并将新值分配给n,将其用作es的索引,并将该元素转换为类型E,然后将其分配给类型为x的最终变量E

final Comparator<? super E> cmp;

问号是通配符。 <? super E>的意思是“是E的祖先的某种类型”。至于为什么将comparator分配给局部变量cmp,我不太确定,但我记得最近在另一个问题中也提出过类似的问题。我将查看是否可以找到它并编辑此答案。希望对您有所帮助。如果我说的话不清楚,请询问,我将尝试重新解释。

编辑:This是我在上一段中提到的问题。答案暗示了性能上的好处,但是我再次不确定这是否是这种情况的原因,因为具体情况略有不同。

,

这是否意味着“将数组队列分配给变量es

是的

并访问元素0,如果不为null,请执行以下操作?

是的

结果=(E)表示什么意思?

与上述两个表达式同时,它还将queue[0]分配给result(E)是强制类型转换。所以基本上就是这样:

result = queue[0]

还有一些多余的东西。

最终E x =(E)es [(n = --size)] ;?这是否意味着递减大小,将该值分配给n,然后在es数组中访问该索引?

是的

如果是这样,则此表达式前的x =(E)是什么意思?我猜这意味着将元素转换为E类型?

是的,还是像以前一样进行转换。

比较器是一个类变量

comparator可能只是一个实例变量,而不是类变量。检查其定义。

为什么将其分配给局部变量cmp

我想复制一个局部变量。我看不出在代码中执行此操作的充分理由,因此这可能是一个错误,也可能是在更改某些先前的代码后遗留下来的东西。

问号在第一行是什么意思?

问号表示Comparator的类型是未知的,并且可以是任何类型,只要它是E的超类即可。例如,如果Integer没有ComparatorNumber有,那么没关系,NumberInteger的超类,这就足够了