【问题标题】:How do I find the middle element of an ArrayList?如何找到 ArrayList 的中间元素?
【发布时间】:2015-01-14 06:45:56
【问题描述】:

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

【问题讨论】:

    标签: arraylist collections


    【解决方案1】:

    事实证明,正确的 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

    所以,假设您想要“中间”元素(即 5 项列表中的第 3 项 - 两边各 2 项),它会是这样的:

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

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

    如果您接受“中间”将偏向于数组末尾,则上述逻辑也适用。否则,您必须检测元素的大小何时是均匀的并相应地表现。给你的螺旋桨帽朋友上弦...

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 也许用markdown格式化?除了那个好答案
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-30
        • 1970-01-01
        • 2016-07-24
        • 2015-07-06
        • 2020-02-27
        • 2014-10-29
        • 1970-01-01
        • 2016-01-02
        相关资源
        最近更新 更多