如何找到 ArrayList 的中间元素?

How do I find the middle element of an ArrayList?

如何找到 ArrayList 的中间元素?如果大小是偶数或奇数呢?

事实证明,适当的 ArrayList 对象(在 Java 中)保持其大小作为对象的 属性,因此对 arrayList.size() 的调用只是访问一个内部整数。简单。

/**
 * Returns the number of elements in this list.
 *
 * @return the number of elements in this list
 */
public int size() {
    return size;
}

它是可用的最短(就字符而言)和最快(就执行速度而言)的方法。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.0size

因此,假设您想要 "middle" 元素(即 5 项列表中的第 3 项 -- 两边各有 2 项),它是这样的:

Object item = arrayList.get((arrayList.size()/2)+1);

现在,如果您正在考虑大小均匀的数组,它会变得有点棘手,因为不存在精确的中间。在 4 个元素的数组中,一侧有一个项目,另一侧有两个项目。

如果您接受 "middle" 将偏向数组的末尾,则上述逻辑也有效。否则,您将必须检测元素的大小何时为偶数并做出相应的行为。给你的螺旋桨无檐小便帽朋友们上链...

Object item = arrayList.get((arrayList.size()/2) + (arrayList.size() % 2));

如果您有不使用 arraylist.size() / arraylist.length() 方法的限制;您可以使用 两个迭代器 。其中一个从数组的开头迭代到末尾,另一个从末尾迭代到开头。当它们到达 arraylist 上的相同索引时,您就会找到中间元素。

可能需要一些额外的控制来确保迭代器在下一次迭代之前相互等待,你不应该错过汇合点..等等

在迭代时,对于两个迭代器,您都保留它们读取的元素总数。所以他们应该在一个循环中迭代一个元素。使用 cycle,我的意思是包含这些操作的过程:

  • iteratorA 从头读取一个元素
  • iteratorB从末尾读取一个元素

迭代器可能需要读取多个索引才能读取一个元素。换句话说,你应该在一个循环中跳过一个元素,而不是一个索引。

如果数组列表是奇数:list.get(list.size() / 2); 如果数组列表是偶数:list.get((list.size() / 2) -1);