DescendingIterator for java.util.List

LinkedList can be repeated using an upstream or downstream iterator as follows:

       LinkedList<Object> list = new LinkedList<Object>();
       ...
   StringJoiner sJ1 = new StringJoiner(" ");
   list.iterator().forEachRemaining(a -> sJ1.add(a.toString()));
   System.out.println("averse: \n" + sJ1.toString());

   StringJoiner sJ2 = new StringJoiner(" ");
   list.descendingIterator().forEachRemaining(a -> sJ2.add(a.toString()));
   System.out.println("reverse: \n" + sJ2.toString());
averse: 
Hello 2 Chocolate 10
reverse: 
10 Chocolate 2 Hello

But descendingIterator is not available for List and ArrayList. Is there a workaround or explanation of the list why the descendingIterator is not in the list?

The question is similar to Is it possible to do for each cycle in java in reverse order? . But all answers recommend special solutions or third-party libraries.

Maybe this is possible using thread streams? (Unfortunately, my googling only gives the lack of a standard reverse for reverse order Java 8 stream )

As I said, my questions are related to threads, but:

+4
3

, List . List ListIterator, hasPrevious() previous(). , , .

, Iterable a ListIterator :

static <T> Iterable<T> descendingIterable(List<? extends T> list) {
    return () -> {
        ListIterator<? extends T> li = list.listIterator(list.size());
        return new Iterator<T>() {
            public boolean hasNext() { return li.hasPrevious(); }
            public T next() { return li.previous(); }
        };
    };
}

:

    List<String> list = Arrays.asList("Hello", "2", "Chocolate", "10");
    StringJoiner sj = new StringJoiner(" ");
    descendingIterable(list).iterator().forEachRemaining(sj::add);
    System.out.println(sj);

    10 Chocolate 2 Hello

:

    for (String s : descendingIterable(list)) {
        System.out.println(s);
    }

    10
    Chocolate
    2
    Hello

Iterator Iterable, , .

, , , , List . :

        list.listIterator(list.size())

, , CopyOnWriteArrayList, . . .

+4

, descendingIterator List?

.
, , , .

Java - , , , , .

, , .

, List.

ArrayList , LinkedList , .

:

for(int i=list.size() -1; i >= 0; i--){
    System.out.println(list.get(i));
}

IntStream.range(0, list.size())
        .map(i-> list.size() - 1 - i)
        .mapToObj(list::get)
        .forEach(System.out::println);
+3

:

Intstream , :

IntStream.range(0, list.length())
    .mapToObj(i -> list.get(list.length() - i - 1)
    .forEach(...);

( , )

List<String> reversed = new ArrayList(list);
Collections.reverse(reversed);
reversed.stream()
    .forEach(...)
+1

Source: https://habr.com/ru/post/1669745/


All Articles