java - 如何在 Iterable<T> 中以最有效的方式获取特定位置的元素?

标签 java

我需要获取 Iterable<MyType> 中特定位置的元素为了不循环 Iterable<MyType> 的所有元素因为我知道所需元素位于哪个位置(就我而言,循环遍历所有元素将花费 O(n) 时间,另一方面访问特定元素将花费 O(1) 时间)。 这必须是最后一个元素之前的元素。 但我找不到一种方法来做到这一点。

public interface Iterable<T>显然,没有方法可以访问任意位置的元素。

我尝试类型转换 Iterable<MyType>List<MyType>但在运行时转换失败,显示 ClassCastException 。所以我不能使用ListIterator<E> ,简单List.get(E e)或一些定制Function<T, U>为了向后遍历元素或获取这个元素(我打算做这些事情)。

我当前的代码

// list.getItems() returns Iterable<MyType>
// I know that element I am looking for is at (iterable.size - 2) position
        for(MyType item : list.getItems()) {
            if (item.convertToText().matches(targetElementRegex)) {
                Pattern pattern = Pattern.compile(targetElementRegex);
                Matcher matcher = pattern.matcher(item.convertToText());
                if (matcher.find()) {
                    return Optional.of(Integer.parseInt(matcher.group(1)));
                }
            }
}

如您所见,目前我只是循环遍历 Iterable<T> 中的所有元素直到我到达目标元素,尽管我确实知道我正在寻找的目标元素位于哪个位置。 我想获取 Iterable<MyType> 中特定位置的元素.

我想找到最有效的方法来做到这一点(或者至少是比我当前的解决方案更好的方法)。

UPD:list是第三方库的类的实例,我没有写getItems()我也无法在 list 中添加新内容类。

最佳答案

Iterable 无法为您提供在给定位置提取元素的方法,这是设计使然。集合框架包含更专门的类来处理具有 O(1) 元素访问的顺序集合。这些是各种众所周知的列表实现,尤其是那些实现 RandomAccess 接口(interface)的实现。

如您所见,选择集合接口(interface)会产生很大的差异,尤其是在涉及 O(xxx) 表示法时。这是多功能性和性能之间的权衡。像 Iterable 这样的通用接口(interface)为您提供了最广泛的适用输入集,但您只能获得 RandomAccess 集合的性能。

如果您要使用的所有输入都是 RandomAccess 集合(ArrayList 实现它),则没有理由将它们处理为 Iterable 。如果不是这种情况,您可以在运行时检查此条件并选择最有效的算法。

关于java - 如何在 Iterable<T> 中以最有效的方式获取特定位置的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56898944/

相关文章:

java - GXT - 如何将网格过滤器参数添加到请求 URL(获取参数)?

java - 如何以编程方式导入 Java 类

java - Android Studio 没有启动。显示类似 "tools, extra-android-m2repository and 6 more SDK components were not installed"的问题

java - java中程序关闭后如何存储变量的值

java - 在 JAVA 中从 XML 文件打印子元素时答案无效

java - 如何将多个 csv 文件合并为一个 csv 文件

Java的HashMap冲突解决

java - AssetManager空指针异常

java - Java 迭代多个 Set

java - 在 Java 中创建数组对象?