Konstruktor przyjmujący kontener

0

Jedna z części zadania, przed którym się zatrzymałem, brzmi:
Do klasy XList<T> dodaj konstruktor przyjmujący dowolny kontener standardowy Javy i tworzący XList wypełnioną jego elementami.

ArrayList<Double> v = new ArrayList<Double>();
    v.add(new Double(1.0));
    v.add(new Double(5.0));
    v.add(new Double(3.0));
    xList<Double> list = new XList<Double>(v);
  

Problem w tym, że w krótkim czasie otrzymałem sporo materiału do opanowania i niestety na tym etapie nie mogę sobie poradzić zupełnie. Nie mam pomysłu na zadanie. Czy byłby ktoś tak łaskawy i podesłałby mi przykładowe linki, gdzie tworzy się konstruktory przyjmujące kontenery?, Albo jakieś uwagi do tego konkretnego zadania?

1

Musisz najpierw stworzyc sobie klasę, która nazywa się XList, w której zadeklarujesz pole typu Collection<T> z pakietu java.util. Potem wystarczy, że utworzysz do niej konstruktor przyjmujący argument typu Collection<T> i przypiszesz go do pola klasy (jak bedziesz probowal, to nawet pewnie uda ci sie wygenerowac go w IDE na podstawie zadeklarowanego pola). Oprocz tego, jesli klasa ma dziala z kodem ktory umiesciles, musi byc generyczna - dokumentacja dobrze opisuje jak to mozna osiagnac

0

Nieudolnie próbuję wykorzystać te uwagi, ale dopóki tego nie zrozumiem, to pewnie robię błędy, teraz nie potrafię przejść przez Iteratora...

import java.util.*;

class Utils {

    public static <T extends Comparable<T>>
    void print(XList<T> list) {
        for (T elem : list) {
            System.out.println(elem);
        }
    }
}

public class XList<T extends Comparable<T>>
        implements Iterable<T> {
    ArrayList<Double> v = new ArrayList<Double>();
    Collection<T> list;

    public XList(Collection<T> list) {
        this.list = list;
    }

    public static void main(String[] args) {
        ArrayList<Double> v = new ArrayList<Double>();
        v.add(new Double(1.0));
        v.add(new Double(5.0));
        v.add(new Double(3.0));
        XList<Double> list = new XList<Double>(v);
        Utils.print(list);
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            int i = 0;

            @Override
            public boolean hasNext() {
                return i < list.size();
            }

            @Override
            public T next() {
                if (hasNext()) {
                    return list.get(i++);       //tego nie potrafię przeskoczyć...
                }
                return null;
            }
        };
    }
}

Czy idę w zupełnie złym kierunku?

0

Chyba najlatwiej bedzie, jak zamiescisz pelna tresc zadania, bo ciezko wywnioskowac co ten kod ma robic - pewnie czesc rzeczy dodales probujac cos zaimplementowac, a czesc wynika z wymagan. Jesli nie mozesz tego zrobic, to napisz po co chcesz implementowac interfejs Iterable

problem z fragmentem kodu, ktory wskazales jest taki ze... ani interfejs Iterable, ani Collection (który jest rozszerzeniem Iterable i jest twoim typem pola list) nie deklaruje takiej metody jak get.

P.S. nie jest to najistotniejsze na twoim etapie poznawania Javy, ale dla porządku moglbys stworzyc sobie klase glowna programu z metoda main, aa oddzielnie miec definicje klasy XList

0

Generalnie trzeba było napisać generyk, gdzie typ T miał implementować interfejs systemowy Comparable<T> wraz z klasą Utils zawierającą metodę statyczną print, oraz stworzyć konstruktor, który będzie przyjmował dowolny kontener standardowy javy tworząc XList wypełnioną jego elementami. Reszta tu dla mnie nie jest istotna. Ja po prostu nie bardzo rozumiem tego stwierdzenia: stworzyć konstruktor, który będzie przyjmował dowolny kontener standardowy javy tworząc XList wypełnioną jego elementami.

0

Okej, w takim wypadku myślę ze w zasadzie zadanie juz zrealizowałeś, trzeba to tylko doszlifować. Możesz wyrzucić z XList pole ArrayList - i zostawić samo Collection<T>. Nie ma potrzeby, żeby twoja klasa w ogóle implementowała interfejs Iterable - możesz wywalić metodę iterator.

Po tym jak wydzielisz sobie metodę main do osobnej klasy, jak pisałem w poprzednim poście, możesz zrobić test i sprobować tworzyć instatncje klasy XList za pomocą tego konstruktora przyjmującego kontener, ale za każdym razem przekazując mu inną implementację interfejsu Collection - czyli ArrayList, HashMap, TreeSet, PriorityQueue itd. Wyglada na to, ze chodzi o to żeby dostrzec ze stosując interfejs i generyki masz bardzo elastyczna implementację swojej klasy.

0

Biorąc pod uwagę powyższe, mógłbym zrobić coś takiego:
class XList:

package TestXList;

import java.util.ArrayList;
import java.util.Collection;

class XList<T extends Comparable<T>>{

    Collection<T> list;

    public XList(Collection<T> list) {
        this.list = list;
    }
}

class TestXList

package TestXList;

import java.util.ArrayList;

public class TestXList {
    public static void main(String[] args) {
        ArrayList<Double> v = new ArrayList<Double>();
        v.add(new Double(1.0));
        v.add(new Double(5.0));
        v.add(new Double(3.0));
        ArrayList<Double> list = new ArrayList<Double>(v);
        list.stream().forEach(System.out::println);
    }
}

i działa, tylko mam wątpliwość czy to będzie dobrze, bo wtedy np. nie wykorzystuję klasy Utils, a wydaje mi się, że powinienem....

1 użytkowników online, w tym zalogowanych: 0, gości: 1