Przekazanie stosu z klasy do klasy.

0

Cześć, czy ktoś może podpowiedzieć, jak przekazać stos z class Writer do class Splitter bez dziedziczenia?

package com;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        //Writer writer = new Writer();
        //writer.generateStrings();
        Splitter filter = new Splitter(10);
        filter.split();
        filter.print();
    }
}

class Writer {

    private static final Random random = new Random();
    private Deque<String> charakterString;

    private int loopLaps;

    public Writer(int loopLaps) {
        this.loopLaps = loopLaps;
        charakterString = new ArrayDeque<>();
    }

    public Deque<String> generateStrings() {
        char sign = 'a';
        for (int i = 0; i < 10; i++) {
            String string = "";
            int charRandom = random.nextInt(50) + 1;
            for (int j = 0; j < charRandom; j++) {
                string = string + sign;
            }
            charakterString.push(string);
        }
        return charakterString;
    }
}

class Splitter extends Writer {

    private List<String> evenList = new ArrayList<>();
    private List<String> oddList = new ArrayList<>();

    public Splitter(int loopLaps) {
        super(loopLaps);
    }

    public void split() {
        Deque<String> stringDeque = generateStrings();
        while (!stringDeque.isEmpty()) {
            double modulo = (double) stringDeque.peek().length() % 2;
            if (modulo == 0) {
                evenList.add(stringDeque.pop());
            }
            if (modulo > 0) {
                oddList.add(stringDeque.pop());
            }
        }
    }

    public void print() {
        int i = 0;
        for (String item : evenList) {
            i++;
            System.out.println("numer iteracji: " + i + " - " + item + " Długość znaków - " + item.length());
        }

        System.out.println();
        int j = 0;
        for (String item : oddList) {
            j++;
            System.out.println("numer iteracji: " + j + " - " + item + " Długość znaków - " + item.length());
        }
    }
}
4

Dla mnie to trochę wszystko jest bez sensu.

Klasa Writer nie robi tego co nazwa sugeruje tylko generuje Deque<String>. Do tego nie wiem po co klasa Splitter ją rozszerza. Po co w klasie Splitter metody print i println? oO
W ogóle po co jest ta klasa Splitter?

Może zacznij od napisania co chcesz zrobić? Będzie łatwiej coś poradzić.

3

Dodam do @Andy

Przekazać stos (który jest nie wiadomo w sumie czym), się robi tak jak przekazanie każdej innej klasy / obiektu:

  • prze konstruktor z jednej klasy do drugiej
  • przez konstruktory ze wspólnego rodzica do obu
  • (nad - ambitne. Wspominam dla pełności obrazu) przez jakaś usługę, osiągalną z obu klas
  • przez argument do WIODĄCEJ metody
  • na fesnaście innych sposobów

Obawiam się, przy mieliźnie tego projektu, moje podpowiedzi go nie uratują

0

@.andy: Program ma wygenerować ciąg (String) znaków, który składa się z losowej ilości znaków 'a' i w zależności czy liczba znaków jest parzysta, czy nie, jest sortowana do odpowiedniej listy (lista parzysta liczby znaków i liczba nieparzysta), a na końcu zawartość obu list są wy świetlane wraz z długością znaków.

4

Na pewno napisałbym sobie klasę typu CharatcterGenerator, która w konstruktorze przyjmuje chara dla jakiego będzie generowany losowyciąg tego znaku oraz ilość takich ciągów: CharacterGenerator cg = new CharacterGenerator('a',50);.

Dostaniesz obiekt, który zawiera listę wygenerowanych ciągów. W tej klasie mógłbyś sobie zaimplementować metody: getEven() i getOdd(), które by zwracały listę parzystych i nieparzystych ciągów.
Te metody można by było przenieść np. do interfejsów i CharacterGenerator by je implementował.

Dodatkowo robisz sobie interfejs Printer który ma metodę print(). Tworzysz sobie implementację tej klasy np. FilePrinter, która zapisuje rezultat do pliku, ConsolePrinter, która np. zapisuje wynik na konsolę itp.

To tak na szybko jak można to zrobić w miarę szybko i prosto.

0

@AnyKtokolwiek: @.andy: O coś takiego chodziło?

package com;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Deque<String> stringDeque = new ArrayDeque<>();
        GenerateDequeString generateDequeString = new GenerateDequeString(stringDeque,10);
        Splitter splitter = new Splitter(generateDequeString.generateStrings());
        splitter.split();
        splitter.print();
    }
}

class GenerateDequeString {

    private static final Random random = new Random();
    private Deque<String> stringsDeque;

    private int loopLaps;

    public GenerateDequeString(Deque<String> stringDeque, int loopLaps) {
        this.loopLaps = loopLaps;
        this.stringsDeque = stringDeque;
    }

    public Deque<String> generateStrings() {
        char sign = 'a';
        for (int i = 0; i < loopLaps; i++) {
            String string = "";
            int charRandom = random.nextInt(50) + 1;
            for (int j = 0; j < charRandom; j++) {
                string = string + sign;
            }
            stringsDeque.push(string);
        }
        return stringsDeque;
    }
}

class Splitter {

    private List<String> evenList;
    private List<String> oddList;
    private Deque<String> stringDeque;

    public Splitter(Deque<String> stringDeque) {
        this.stringDeque = stringDeque;
        evenList = new ArrayList<>();
        oddList = new ArrayList<>();
    }

    public void split() {
        while (!stringDeque.isEmpty()) {
            double modulo = (double) stringDeque.peek().length() % 2;
            if (modulo == 0) {
                evenList.add(stringDeque.pop());
            }
            if (modulo > 0) {
                oddList.add(stringDeque.pop());
            }
        }
    }

    public void print() {
        int i = 0;
        for (String item : evenList) {
            i++;
            System.out.println("Numer iteracji: " + i + " - " + item + " Długość znaków - " + item.length());
        }

        System.out.println();
        int j = 0;
        for (String item : oddList) {
            j++;
            System.out.println("Numer iteracji: " + j + " - " + item + " Długość znaków - " + item.length());
        }
    }
}
0
Ukulelemelelele napisał(a):

@AnyKtokolwiek: @.andy: O coś takiego chodziło?

MSZ brzydkie to jak cholera.
To nie ma nic wspólnego z dobrymi praktykami OOP
Wyżej @.andy dał fajny zarys, jak to robić

UPDATE: to, że występuje "jakaś klasa" lub "jakieś klasy", to o wiele nie to

1

Dodatkowo w obiekcie CharacterGenerator zamiast robić coś w stylu List<String> dla listy tych ciągów, mógłbyś zrobić List<Character>, gdzie obiekt Character by się np. mógł składać z: pola, które trzyma długość ciągu, drugiego pola które trzyma czy ten ciąg oraz pola czy ciąg jest parzysty czy nie.

2

O coś takiego chodziło?

  1. Po co ten generator przyjmuje Deque jako argument? o_O
  2. Po co ma w ogóle pole z tym deque? Jak dla mnie powinien mieć 2 pola -> znak który ma generować i ile ma generować i tyle. A potem za każdym razem jak wołasz metodę to generuje nowego Deque i tyle
  3. Dla mnie splitter nie powinien mieć żadnych pól. Ot jako argument metody split podajesz Deque a to ci zwraca wynik który zawiera te dwie listy i tyle
  4. To splitowanie to jest dramat. Po co non stop liczysz to modulo? I jeszcze wynik %2 zapisany jako double. I jeszcze porównywanie double z 0. Dramat :D Podpowiem ci że jak miałeś parzystą liczbę to w następnym obiegu pętli będzie nieparzysta, nie trzeba tego od nowa przeliczać :D
0

@Shalom: @.andy: Dzięki za odzew, zadanie już zaliczone (ale i tak przyjdę zaraz z kolejnym, bo nie wiem jak usunąć z mapy obiekt, którego klucz nie jest Integerem, tylko innym obiektem przyjmującym stringi). :)

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