Toon posts:

[java] Linkedlist iterator

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class TestSet
{
    public static void main(String[] args)
    {
        Set testset = new Set();

        testset.add(3); //3
        testset.add(2); //23
        testset.add(4); //234
        testset.add(1); //1234

        testset.remove(2); //134
        testset.add(7);   //1347

        testset.print();
    }
}


import java.util.LinkedList;
import java.util.ListIterator;

public class Set
{
    private LinkedList integers;

    public Set()
    {
        integers = new LinkedList();
    }

    //Geeft terug of het toevoegen gelukt is
    public boolean add(int x)
    {
        ListIterator iterator = integers.listIterator();

        while (iterator.hasNext())
        {
            Integer getal = (Integer) iterator.next();

            if (getal.intValue() == x)
                return false;  // getal mag niet dubbel voorkomen 
            else if (getal.intValue() > x)
            {
                iterator.previous();
                iterator.add(new Integer(x));
                return true;
            }
        }

        iterator.add(new Integer(x));
        return true;
    }

    //Geeft terug of het verwijderen gelukt is
    public boolean remove(int x)
    {
        ListIterator iterator = integers.listIterator();
        boolean done = false;

        while (iterator.hasNext() && !done)
        {
            Integer getal = (Integer) iterator.next();
            if (getal.intValue() == x)
            {
                iterator.remove();
                return true;
            }
            else if (getal.intValue() > x)
            {
                done = true;
            }
        }
        return false;
    }

    public void print()
    {
        ListIterator iterator = integers.listIterator();
        while (iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
    }
}

Ik heb dit proggie gemaakt om integers toe te voegen en te verwijderen in een in linked list. Ze blijven op volgorde en verder niets bijzonders.

Nu is t volgende nodig:

Er moet een iterator object toegevoegd worden aan de Set klasse, maar deze mag alleen de next/HasNext methode ondersteunen.
code:
1
2
3
SetIterator iterator = mySet.setIterator();
while (iterator.hasNext())
       System.out.println(iterator.next());

Heeft iemand een idee hoe dit gedaan moet worden.

Thx alvast!
MzzL

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik begrijp je vraag niet helemaal, maar ik zal wat proberen ;) .

Als de iterator met de primitieven moet gaan werken (ints dus) zal je een eigen interface moet schrijven:
code:
1
2
3
4
5
public interface IntCollectionIterator
{
    public boolean hasNext();
    public int next();
}

De implementatie is niet zo ingewikkeld. Je kan gewoon een iterator aan de LinkedList vragen en deze meegeven aan een eigen iterator implementatie.

Als je gewoon met de standaard Objecten kunt werken (Integer dus) wordt het helemaal makkelijk. Je hoeft dan geen eigen interface te maken. Maak dan gewoon een eigen Iterator implementatie die een iterator van de LinkedList meekrijgt. Bij de operaties die je niet toestaat gooi je een UnSupportedOperationException. De andere forward je naar de echte iterator. Dit is als het ware een soort toepassing van het Decorator pattern.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Het is idd de bedoeling om met die Integer objecten te werken

Alleen wat jij bedoelt met een Iterator vragen? Dr komt toch geen andere Iterator meer in voor behalve die van jezelf? Of zit ik nu helemaal verkeerd. Ben dr ook al de hele dag mee bezig daarom........

:(

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
caedes: Alleen wat jij bedoelt met een Iterator vragen? Dr komt toch geen andere Iterator meer in voor behalve die van jezelf?
Je gebruikt toch zelf al de iterator van die LinkedList? Als ik het goed begrijp wil je nu zelf ook een iterator voor je Set klasse (die naam is overigens een beetje verwarrend samen met java.util.Set..).

Je kunt dan als je die remove en add vereisten even negeert gewoon het volgende doen:
code:
1
2
3
4
public Iterator iterator()
{
    return integers.iterator();
}

Je wilt nu dus alleen nog de remove methode niet ondersteunen. Daarvoor kan je een eigen iterator implementatie maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class NoRemoveIterator implements Iterator
{
    private Iterator decorated;

    public NoRemoveIterator(Iterator decorated)
    {
      super();
      this.decorated = decorated;
    }

    public boolean hasNext()
    {
      return decorated.hasNext();
    }

    public Object next()
    {
      return decorated.next();
    }

    public void remove()
    {
      throw new UnSupportedOperationException("This iterator doesn't support removing items");
    }
}

Deze NoRemoveIterator kan je dan aanmaken met de iterator van de LinkedList.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment