问题描述
我正在尝试将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
没有Comparator
但Number
有,那么没关系,Number
是Integer
的超类,这就足够了