有人可以帮助将这个简洁的 Java 函数解构为简单的英语吗?
Can someone help deconstruct this terse Java function into plain English?
我正在尝试将 PriorityQueue
class 从 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, x, es, n, cmp);
}
}
return result;
}
变量 queue
是在 class 上定义的 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
是一个 class 变量(持有 Comparator
)。为什么要赋值给局部变量cmp
,第一行的问号是什么意思?
1- if ((result = (E) ((es = queue)[0])) != null)
首先,它将数组 queue
分配给变量 es
并从中获取元素 0
并将其转换为 E
泛型并将其分配给 result
然后检查如果 result
不为空。
2- final E x = (E) es[(n = --size)];
首先 java 评估 --size
然后分配给 int 类型 n
然后从 es
数组中获取第 n
,将其转换为 E
,然后分配它到变量 x
.
我想你问的接下来的两行现在很清楚了!
看看我能不能帮上忙:
if ((result = (E) ((es = queue)[0])) != null)
上面的意思是“将queue
分配给es
,访问它的索引0,将其转换为类型E
,将其分配给result
并执行以下操作如果它不为空。
final E x = (E) es[(n = --size)];
这意味着“从 size
中减去一个并将新值分配给 n
,将其用作 es
的索引并将该元素转换为类型 E
, 然后将其赋值给 E
.
类型的最终变量 x
final Comparator<? super E> cmp;
问号是通配符。 <? super E>
表示“某种类型是 E 的祖先”。至于为什么 comparator
被赋值给局部变量 cmp
,我不是很确定,但我记得最近在另一个问题中被问到类似的问题。我会看看是否可以找到它并编辑此答案。我希望这至少能对你有所帮助。如果我所说的任何内容不清楚,请提问,我会尝试改写解释。
编辑:是我在上一段提到的问题。答案表明性能优势,但我再次不确定这是否是这种情况的原因,因为具体情况略有不同。
Does this mean "assign the array queue to the variable es
"
是的。
and access element 0 and do the following if it's not null?
是的。
What does the result = (E)
expression mean?
在上面两个表达式的同时,也将queue[0]
赋值给了result
。 (E)
是对类型的强制转换。所以它基本上只是:
result = queue[0]
加上一些额外的东西。
final E x = (E) es[(n = --size)];
? Does this mean decrement size
, assign that value to n
and then access this index within the es
array?
是的。
If so, what does x = (E)
before this expression mean? I'm guessing it means to cast the element to type E
?
是的,又是像以前一样的演员表。
comparator
is a class variable
为了迂腐,comparator
可能是一个实例变量,而不是 class 变量。检查它的定义。
Why assign it to a local variable cmp
我想复制一个局部变量。我在代码中看不到这样做的充分理由,所以这可能是一个错误,或者是在更改了之前的代码后留下的东西。
and what does the question mark mean on the first line?
问号表示 Comparator
的类型未知,可以是任何类型,只要它是 E
的超级 class。例如,如果 Integer
没有 Comparator
但 Number
有,那没关系,Number
是 Integer
的超 class这已经足够了。
我正在尝试将 PriorityQueue
class 从 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, x, es, n, cmp);
}
}
return result;
}
变量 queue
是在 class 上定义的 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
是一个 class 变量(持有 Comparator
)。为什么要赋值给局部变量cmp
,第一行的问号是什么意思?
1- if ((result = (E) ((es = queue)[0])) != null)
首先,它将数组 queue
分配给变量 es
并从中获取元素 0
并将其转换为 E
泛型并将其分配给 result
然后检查如果 result
不为空。
2- final E x = (E) es[(n = --size)];
首先 java 评估 --size
然后分配给 int 类型 n
然后从 es
数组中获取第 n
,将其转换为 E
,然后分配它到变量 x
.
我想你问的接下来的两行现在很清楚了!
看看我能不能帮上忙:
if ((result = (E) ((es = queue)[0])) != null)
上面的意思是“将queue
分配给es
,访问它的索引0,将其转换为类型E
,将其分配给result
并执行以下操作如果它不为空。
final E x = (E) es[(n = --size)];
这意味着“从 size
中减去一个并将新值分配给 n
,将其用作 es
的索引并将该元素转换为类型 E
, 然后将其赋值给 E
.
x
final Comparator<? super E> cmp;
问号是通配符。 <? super E>
表示“某种类型是 E 的祖先”。至于为什么 comparator
被赋值给局部变量 cmp
,我不是很确定,但我记得最近在另一个问题中被问到类似的问题。我会看看是否可以找到它并编辑此答案。我希望这至少能对你有所帮助。如果我所说的任何内容不清楚,请提问,我会尝试改写解释。
编辑:
Does this mean "assign the array queue to the variable
es
"
是的。
and access element 0 and do the following if it's not null?
是的。
What does the
result = (E)
expression mean?
在上面两个表达式的同时,也将queue[0]
赋值给了result
。 (E)
是对类型的强制转换。所以它基本上只是:
result = queue[0]
加上一些额外的东西。
final E x = (E) es[(n = --size)];
? Does this mean decrementsize
, assign that value ton
and then access this index within thees
array?
是的。
If so, what does
x = (E)
before this expression mean? I'm guessing it means to cast the element to typeE
?
是的,又是像以前一样的演员表。
comparator
is a class variable
为了迂腐,comparator
可能是一个实例变量,而不是 class 变量。检查它的定义。
Why assign it to a local variable
cmp
我想复制一个局部变量。我在代码中看不到这样做的充分理由,所以这可能是一个错误,或者是在更改了之前的代码后留下的东西。
and what does the question mark mean on the first line?
问号表示 Comparator
的类型未知,可以是任何类型,只要它是 E
的超级 class。例如,如果 Integer
没有 Comparator
但 Number
有,那没关系,Number
是 Integer
的超 class这已经足够了。