Мне нужно получить элемент в определенной позиции в 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
class.