1. Skriv en generisk klass som implementerar följande interface för mängder:

    public interface Set<E> {
        void add(E e);
        void remove(E e);
        boolean contains(E e);
        int size();
    }

    add ska lägga till elementet i mängden om det inte redan finns ett likadant (equals). remove ska ta bort ett element som är likadant (equals) om ett sådant finns. contains ska avgöra om ett likadant element finns i mängden. size ska tala om hur många element som finns i mängden. Implementationen ska kräva att den generiska typen implementerar Comparable. Den ska använda en sorterad (enligt compareTo) array för att lagra elementen och binärsökning för att hitta dem. Du kan använda java.util.ArrayList istället för en primitiv Java-array. Då blir det enkelt att skjuta in och ta bort element. Du måste inte implementera binärsökning själv utan kan använda metoden Collections.binarySearch.

  2. Ändra följande klass så att den implementerar Comparable enligt beskrivningen nedan.

    public class Entry {
        public int n;
        public String s;
    
        public Entry(int n, String s) {
            this.n = n;
            this.s = s;
        }
    }

    Om första (mest signifikanta) siffran i decimalrepresentationen av variabeln n i en instans e1 är mindre/större än motsvarande siffra i en instans e2 så ska e1 vara mindre/större än e2. Om första siffrorna är lika så ska e1 vara mindre än e2 om e1:s variabel s innehåller fler tecken än e2:s s. Om den innehåller färre teckan ska e1 anses vara större. Om s i e1 och e2 innehåller lika många tecken ska instanserna vara lika.

    Exempel:

        Entry e1 = new Entry(23455, "1");
        Entry e2 = new Entry(7255, "22");
        Entry e3 = new Entry(71, "vv");
        Entry e4 = new Entry(224544, "333");

    För dessa instanser ska följande gälla:

    e4 < e1 < e2 = e3

    T.ex. så ska e1.compareTo(e2) returnera ett tal som är mindre än 0.

  3. Följande klass används för att representera personer i ett släktforskningsprogram:

    public class Person {
        public final String name;
        public final Person mother, father;
          // null indicates no known mother/father
    
        public Person(String name, Person mother, Person father) {
                this.name = name;
                this.mother = mother;
                this.father = father;
        }
    }

    Varje person har ett namn, en mor och en far. Om mor eller far är okänd så sätts respektive variabel till null.

    Lägg till en metod

    public boolean isDescendantOf(Person p)

    som avgör om aktuell person är en ättling (enligt det som modeller känner till) till p, d.v.s. barn eller barnbarn eller ...

    När du avgör om två personer är samma så använd identitetslikhet, d.v.s. ==, ej t.ex. personernas namn.

    Test:

        Person p1 = new Person("Asta", null, null);
        Person p2 = new Person("Ingolf", null, null);
        Person p3 = new Person("Kerstin", p1, p2);
        Person p4 = new Person("Börje", p1, p2);
        Person p5 = new Person("Svampbob#", null, null);
        Person p6 = new Person("Tindra", p3, p5);
    
        System.out.println(p6.isDescendantOf(p3));  --> true
        System.out.println(p6.isDescendantOf(p4));  --> false
        System.out.println(p6.isDescendantOf(p2));  --> true
        System.out.println(p1.isDescendantOf(p6));  --> false
        System.out.println(p4.isDescendantOf(p4));  --> false
  4. Skriv en klass som implementerar avbildningar med följande interface

    import java.util.Iterator;
    
    public interface Map<K, V> {
        V get(K key);
        void put(K key, V value);
        void remove(K key);
        int size();
        Iterator<K> keysIterator();
    }

    get ska returnera värdet som key är associerad med i avbildningen, eller null om key inte är associerad till något värde. put ska associera nyckeln key med värdet value. Om key redan var associerad med ett värde så ska denna associering tas bort. remove ska ta bort associeringen för key om en sådan finns. size ska returnera antal nyckel-värde-par i avbildningen. keysIterator ska returnera en iterator som går igenom alla nycklar i avbildningen.

    Du kan implementera klassen på enklast möjliga sätt förutom att använda någon implementering av java.util.Map i API:t. Använd t.ex. en ArrayList och lägg in objekt som var och ett innehåller en nyckel och ett värde. Du kan definiera en lokal klass för sådana objekt, t.ex.:

    private class Entry {
            public K k;
            public V v;
            public Entry(K k, V v) {
                this.k = k;
                this.v = v;
            }
    }

    Du kan då alltså ha en variabel av typen ArrayList<Entry> i din klass. Du kan lägga nyckel-värde-par i denna i godtycklig ordning. När du letar efter en nyckel kan du söka igenom listan linjärt.