• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak iterować w Javie po LinkedLiście?

Object Storage Arubacloud
0 głosów
684 wizyt
pytanie zadane 11 stycznia 2019 w Java przez k222 Nałogowiec (30,150 p.)
Cześć, mam dosyć banalny problem - mam jakąś kolejkę w Javie (może być LinkLista) i chcę po niej iterować w sposób najbardziej efektywny tak, aby mieć dostęp do obecnego i następnego elementu (chcę na obecnym elemencie wykonać funkcję porównującą go w jakiś sposób z następnym). W C++ załatwił bym to wskaźnikami, ale w Javie nie wiem jak się do tego zabrać, bo Iterator nie daje mi dostępu do aktualnego elementu, tylko do następnego, a iterowanie używając metody .get() LinkedListy w taki sposób jest mega nieefektywne. Jak więc takie coś zrobić?

1 odpowiedź

+1 głos
odpowiedź 11 stycznia 2019 przez mbabane Szeryf (79,280 p.)
wybrane 11 stycznia 2019 przez k222
 
Najlepsza

Najpewniej streamami. Co dokładniej chcesz osiągnąć? Pod jakim kątem to ma być porównanie.

Taki przykład:

List<Integer> linkedList = new LinkedList<>();

linkedList.add(1);
linkedList.add(1);
linkedList.add(2);
linkedList.add(10);
linkedList.add(5);

List<Integer> collect = linkedList.stream()
                .filter(e -> e > 1)
                .filter(e -> e < 10)
                .collect(Collectors.toList());

System.out.println(collect);

Wynik:

[2, 5]

 

komentarz 11 stycznia 2019 przez k222 Nałogowiec (30,150 p.)

surprise po takie rzeczy nie sięgałem - strasznie to skomplikowane jak na tak prostą operację. Chodzi po prostu o to, że mam listę obiektów jakiejś klasy (powiedzmy K) i w tej klasie mam funkcję zwracającą booleana (powiedzmy compare) i chcę być w stanie zrobić coś w stylu:

LinkedList<K> list = ...

Iterator i = list.iterator();
while(i.hasNext()) {
if(i.compare(i.next())) ...
}

tylko z iteratorem tego nie zrobię

komentarz 11 stycznia 2019 przez mbabane Szeryf (79,280 p.)
edycja 11 stycznia 2019 przez mbabane

Uwierz to nie jest skomplikowane, bo piszesz co ma być zrobione nie jak.

Co do twojego problemu to rzeczywiście jeśli chodzi o streamy, przeynajmniej wedlug mojej wiedzy, do takich operacji się średnio nadają. Poniżej przykład ze streamem i bez:

class Foo
{
    private int value;

    public Foo(int value)
    {
        this.value = value;
    }


    public boolean compare(Foo foo)
    {
        return foo.value == this.value;
    }

    @Override
    public String toString()
    {
        return "Foo{" +
                "value=" + value +
                '}';
    }
}


public class StreamExample
{
    public static void main(String[] args)
    {
        LinkedList<Foo> linkedList = new LinkedList<>();

        linkedList.add(new Foo(1));
        linkedList.add(new Foo(1));
        linkedList.add(new Foo(2));
        linkedList.add(new Foo(10));
        linkedList.add(new Foo(5));

        linkedList.stream().reduce((current, next) -> {

            if (current.compare(next))
              operation(current);

          return next;
        });


        //mozna tez
        Iterator<Foo> iterator = linkedList.iterator();
        if (iterator.hasNext())
        {
                Foo previous = iterator.next();
                while (iterator.hasNext())
                {
                    Foo current = iterator.next();
                    if (previous.compare(current))
                        operation(previous);
                    previous = current;
                }
            }
    }

    public static void operation(Foo foo)
    {
        System.out.println("Operacja na: " + foo);
    }
}

 

komentarz 11 stycznia 2019 przez k222 Nałogowiec (30,150 p.)
Ta wersja z iteratorem niestety omija elementy tzn. current.compare(next) wykoa się dla elementów 0 i 1 potem 2 i 3 potem 4 i 5 ... a mi trzeba czegoś co wykona się dla 0 i 1, 1 i 2, 2 i 3, ale pokombinuję z dwoma iteratorami- dzięki
komentarz 11 stycznia 2019 przez mbabane Szeryf (79,280 p.)
O kurr.. rzeczywiscie, sorry za wprowadzenie w błąd, ten przykład ze Streamem na pewno tego nie robi.
komentarz 11 stycznia 2019 przez mbabane Szeryf (79,280 p.)
edycja 11 stycznia 2019 przez mbabane

Jest jeszcze coś takiego:

        ListIterator<Foo> iterator = linkedList.listIterator();

        while (iterator.hasNext())
        {
            Foo current = iterator.next();
            if (iterator.hasNext())
            {
                Foo next = iterator.next();
                if (current.compare(next) )
                    operation(current);
                iterator.previous();
            }
        }

Lub

        Iterator<Foo> iterator = linkedList.iterator();

        if (iterator.hasNext())
        {
            Foo previous = iterator.next();
            while (iterator.hasNext())
            {
                Foo current = iterator.next();
                if (previous.compare(current))
                    operation(previous);
                previous = current;
            }
        }

Podmieniłem wersje z iteratorem w pierwszym listningu, żeby ktoś z błędem nie skopiował.

Podobne pytania

0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 1 lipca 2020 w Java przez amtrax Dyskutant (9,630 p.)
0 głosów
3 odpowiedzi 2,390 wizyt
pytanie zadane 15 września 2016 w Java przez Tadeusz Jasińska Nowicjusz (190 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...