KOlekcja Set i zduplikowane zamówienia.

0

Cześć, mam za zadanie napisać program, który będzie przychowywał numery zamówień, numery nie mogą być zduplikowane. Na chwilę obecną napisałem coś takiego:

package com;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Orders orders = new Orders(20);
        orders.printOrders();
    }
}

class GenerateOrderNumber {

    private int number;
    private static final Random random = new Random();

    public GenerateOrderNumber(int number) {
        this.number = number;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof GenerateOrderNumber)) return false;
        GenerateOrderNumber that = (GenerateOrderNumber) o;
        return number == that.number;
    }

    @Override
    public int hashCode() {
        return Objects.hash(number);
    }

    @Override
    public String toString() {
        return "Zamówienie numer: " + number;
    }

    public static GenerateOrderNumber generateOrderNumber() {
        int orderNumber = random.nextInt(10);
        return new GenerateOrderNumber(orderNumber);
    }
}

class Orders {
    private int ordersSize;

    public Orders(int ordersSize) {
        this.ordersSize = ordersSize;
    }

    public Set<GenerateOrderNumber> ordersSet() {
        Set<GenerateOrderNumber> orderNumbers = new HashSet<>();
        for (int i = 0; i < ordersSize; i++) {
            orderNumbers.add(GenerateOrderNumber.generateOrderNumber());
        }
        return orderNumbers;
    }

    public void printOrders() {
        Set<GenerateOrderNumber> orderNumbers = ordersSet();
        for (GenerateOrderNumber item : orderNumbers) {
            System.out.println(item);
        }
    }
}

Numery się nie powtarzają, jednak mój mentor twierdzi, że w tym kodzie tego nie widać... Jak wy to oceniacie?

0

Ten Orders jest dziwny. Bo co to właściwie jest? Nazwa sugeruje, że to kolekcja zamówień, ale nie implementuje Collection. Nawet jeśli nie kolekcja to na logikę spodziewałbym się, że jak raz stworzę to będę miał tam w środku jakieś zamówienia, a tutaj jeśli wywołam printOrders wiele razy to za każdym razem będzie generować nowy zbiór. No i w sumie to czemu ta klasa robi dwie różne rzeczy? Tzn. generuje zbiór i wypisuje go (co gorsza wypisuje generując ad-hoc, wprowadzając dodatkowe zamieszanie).

0

Uruchomiłem na https://www.tutorialspoint.com/compile_java_online.php i nic się nie powtarza.

Jeżeli hashCode i equals są zaimplementowane prawidłowo to Set zwróci tylko i wyłącznie unikalne elementy.

0

@0xmarcin: Czyli jest ok?

Treść zadania brzmi tak:Bez tytułu2.jpg

2

o_O I co ten twój kod ma wspólnego z treścią zadania? Przeciez to jakis hardkor co tam zrobiłeś.

  1. Zrób klasę Order albo OrderNumber która trzyma sobie jakiś numerek i ma poprawny hashcode i equals (albo idźmy z duchem czasu i niech to będzie record
  2. Zró klasę Orders która ma w sobie Set<OrderNumbers>
  3. Profit!

Twoja klasa Orders jest bez sensu bo niczego nie przechowuje tylko w jakiś poryty sposób generuje nowe numerki za każdym razem :D

0

Twoja klasa Orders jest bez sensu bo niczego nie przechowuje

@Shalom: Czyli mam zrobić listę w tej klasie i żeby on później pobierał do set z tej listy?

0

Jaką listę? Gdzie Ty tam widzisz potrzebę użycia listy?

0

Jaką listę? Gdzie Ty tam widzisz potrzebę użycia listy?

@RequiredNickname: No właśnie nigdzie, ale @shalom pisał, że klasa, która generuje numer zamówienia nic nie przechowuje i ona nie ma nic przechowywać, ona ma wygenerować numer i dodać do seta, aa jak się numer powtarza, to ma go nie dodawać.

0

Masz zaprojektować klasę Order przechowującą numer zamówienia w taki sposób aby poprawnie implementowała hashCode & equals żeby się nie gryzło w kolekcji.
Potem masz zaprojektować klasę Orders która będzie przechowywać kolekcję obiektów Order w jakimś zbiorze.

Obiekty typu Order możesz sobie ręcznie utworzyć w metodzie main (np. w petli) i dodać je do klasy Orders.
By przetestować czy nie ma duplikatów możesz spróbować dodać nowy obiekt z takim samym numerem zamówienia (jak któryś z wcześniej wygenerowanych) do klasy Orders i zweryfikować czy się dodał czy nie.

0

Masz zaprojektować klasę Order przechowującą numer zamówienia w taki sposób aby poprawnie implementowała hashCode & equals żeby się nie gryzło w kolekcji.

@RequiredNickname: Wydaje mi się, że mam to zrobione.

Potem masz zaprojektować klasę Orders która będzie przechowywać kolekcję obiektów Order w jakimś zbiorze.

@RequiredNickname: To też - przechowuje w secie.

Obiekty typu Order możesz sobie ręcznie utworzyć w metodzie main (np. w petli) i dodać je do klasy Orders.

@RequiredNickname: Muszą być randomowo wygenerowane i za każdym razem gdy chce dodać kolejne zamówienie do seta to klasa order generuje kolejne zamówienie., jeżeli się powtarza (jest zduplikowane) to go nie dodaje

0

Wydaje mi się, że mam to zrobione.

Przecież Ty tam nawet nie masz klasy Order z polem służącym przechowywaniu numeru zamówienia np. w postaci Stringa.

To też - przechowuje w secie.

Wydaje Ci się. Jedyne co **przechowuje **klasa Orders to wielkość listy w polu ordersSize. Całą resztę generujesz na żywca każdorazowo przy wywołaniu stosownych metod tej klasy.

Muszą być randomowo wygenerowane i za każdym razem gdy chce dodać kolejne zamówienie do seta to klasa order generuje kolejne zamówienie., jeżeli się powtarza (jest zduplikowane) to go nie dodaje

Randomowe generowanie numeru zamówienia możesz sobie załatwić w konstruktorze klasy Order.
Jako, że małą jest szansa, że javovy random wygeneruje Ci 2 takie same numery zamówienia to ten duplikat trzeba wymusić by udowodnić, że Orders nie zezwoli na przechowywanie w swojej strukturze duplikatów.

2
class Order{
    private final int number;
    @Override
    public boolean equals(Object o) {
        // ?
    }

    @Override
    public int hashCode() {
        // ?
    }
}

class Orders{
    private final Set<Order> orders = new HashSet<>();
    public boolean addNextOrder(Order order){
        return orders.add(order);
    }
}
0

@Shalom: dziękuję. ;)

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