Problem z współdziałąniem funkcji

Odpowiedz Nowy wątek
2018-12-14 22:17
0

Dodałem sobie rzeczy do sejfu za pomocą listy i w funkcji add() jestem w stanie je odczytać, ale nie potrafię ich odczytać za pomocą funkcji printContent() no i połączyć tego z toString w klasie Thing.
To pewnie bardzo proste, ale ja nie mam jeszcze takiej biegłości w tym. Pewnie analogiczne byłoby stworzenie funkcji kasującej jakiś element z listy, ale wtedy i jej efekt trzeba by było jakoś połączyć z funkcją zwracającą ostateczną zawartość listy.
Czy mógłbym prosić o jakieś rozjaśnienie mojego przyćmionego umysłu?

import java.util.ArrayList;

class Safe {
    double weight;
    double volume;
    double maxWeight;
    double maxVolume;

    public Safe(double weight, double volume, double maxWeight, double maxVolume){
        this.weight = weight;
        this.volume = volume;
        this.maxWeight = maxWeight;
        this.maxVolume = maxVolume;
    }
    public void add(Thing thing) {
        ArrayList<String> item_name = new ArrayList<String>();
        item_name.add(thing.getName());
        ArrayList<Double> item_weight = new ArrayList<Double>();
        item_weight.add(thing.getWeight());
        ArrayList<Double> item_volume = new ArrayList<Double>();
        item_volume.add(thing.getVolume());

        for (int i = 0; i < item_name.size(); i++) {
            System.out.println(item_name.get(i));
            System.out.println(item_weight.get(i));
            System.out.println(item_volume.get(i));
        }
    }
    public Thing remove(int index) {
}

    public void printContent(){
    }
}

class Thing {
    protected double weight;
    protected double volume;
    protected String name;

    public Thing(String name, double weight, double volume){
        if(name != null)
            this.name = name;
        else
            this.name = "";
        this.weight = Math.max(weight, 0.0);
        this.volume = Math.max(volume, 0.0);
    }

    public double getWeight(){
        return weight;
    }

    public double getVolume(){
        return volume;
    }
    public String getName(){
        return name;
    }
    @Override
    public String toString() {
        return name + " (" + weight + " kg, " + volume + " l)";
    }
}

class Box extends Thing {
    protected double height;
    protected double width;
    protected double depth;

    public Box(String name, double weight,
               double height, double width, double depth){
        super(name, weight, height*width*depth*1000);
        this.height = height;
        this.width = width;
        this.depth = depth;
    }
    public double getHeight(){
        return height;
    }
    public double getWidht(){
        return width;
    }
    public double getDepth(){
        return depth;
    }
}
public class safe1{
    public static void main(String args[]){
        Safe subject = new Safe(0.100, 0.5, 40, 50);
        subject.add(new Thing("Ball", 1, 3));
        subject.add(new Thing("Torch", 0.5, 1));
        subject.add(new Box("Box1", 5, 0.1,0.5,0.5));
        subject.printContent();
//        subject.remove(2);     //to bylby drugi element z listy
    }
}
edytowany 1x, ostatnio: geoinfomat, 2018-12-14 22:20

Pozostało 580 znaków

2018-12-14 22:33
0

Masz listy w metodzie a nie w klasie.
W skrocie. Wchodzis w metoda -> tworzysz liste -> dodajesz obiekt -> wychodzisz z metody -> twoja lista to zmienan lokalna wiec jest usuwana
Stworz liste w klasie i do niej dodawaj :)

edytowany 1x, ostatnio: Ziemiak, 2018-12-14 22:34

Pozostało 580 znaków

2018-12-17 23:27
0
Ziemiak napisał(a):

Masz listy w metodzie a nie w klasie.
W skrocie. Wchodzis w metoda -> tworzysz liste -> dodajesz obiekt -> wychodzisz z metody -> twoja lista to zmienan lokalna wiec jest usuwana
Stworz liste w klasie i do niej dodawaj :)

Bardzo dziękuję za uwagę.
Zrobiłem więc coś takiego w klasie Backpack:

ArrayList<Thing> item = new ArrayList<Thing>();

    public void add(Thing thing) {
        item.add(thing);
    }

    public void printContent(){
        System.out.println(new Thing(Backpack.class.getSimpleName(), this.weight, this.volume) + " with");
        System.out.println();
        for (int i=0;i<item.size();i++) {
            System.out.print((i+1) + ": ");
            System.out.println(item.get(i));
        }
        System.out.println("Total: ");
    }

I wszystko mi się już nawet wyświetla, ale teraz chciałbym policzyć łączny ciężar i objętość wraz wagą i objętością samego pudełka. Czy to się da jakoś wyciągnąć? Podejrzewam, że z listy to chyba nie, więc pewnie z klasy Thing, ale jak?
Tak sobie myślę, że powinienem wagę i objętość pudełka dołożyć jakoś na początek listy, to wtedy łatwiej byłoby z jednego miejsca wyciągnąć te parametry, Ale na ten moment mam za mało umiejętności. Czy mógłbym prosić o pomoc?

edytowany 2x, ostatnio: geoinfomat, 2018-12-17 23:59

Pozostało 580 znaków

2018-12-18 06:40
0

W pierwotnym kodzie nie ma klasy `Backpack'. Zmieniłeś nazwę, czy dopisałeś nową klasę?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2018-12-18 07:33
0
bogdans napisał(a):

W pierwotnym kodzie nie ma klasy `Backpack'. Zmieniłeś nazwę, czy dopisałeś nową klasę?

Oj tak, sejf i plecak to to samo...

Pozostało 580 znaków

2018-12-18 08:08
cs
0
class Backpack{
...
public double getWeight(){
        double total = 0;
    for (int i=0;i<item.size();i++) {
            total += item.get(i).getWeight();
        }
        return total;
    }
}

W kolekcji masz obiekty typu Thing, które mają gettery: getWeight(), getVolume() więc korzystaj z nich.

To jest dziwne, że mam nawet taką samą metodę (jedyne, co się różni to sum zamiast total, ale wczoraj widocznie miałem zły dzień i mi to nie działało. Dziś działa i rzeczywiście sumuje, dziękuję. Zastanawiam się jeszcze tylko jak dodać wagę samego plecaka(sejfu), ale może coś uda mi się wymyślić. Już siadam do kodu :) - geoinfomat 2018-12-18 17:40

Pozostało 580 znaków

2018-12-18 08:10
0

Może tak:

        double totalWeight = 0.0;
        for (int i=0;i<item.size();i++) {
            System.out.print((i+1) + ": ");
            Thing thing = item.get(i);
            System.out.println(thing);
            totalWeight += thing.weight;
        }

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Hmm, kiedy ja się nauczę tak pisać... Super! - geoinfomat 2018-12-18 17:50
Jak dożyjesz moich lat ;) - bogdans 2018-12-18 18:35

Pozostało 580 znaków

2018-12-18 09:06
cs
0

@bogdans Czy uważasz, że lepiej odwoływać się do pola czy do gettera? Wg mnie lepiej korzystać z getterów, przykład może naciągany, ale ilustruje tę różnicę:

class Person{
  protected String name;
  public Person(String name){
    this.name = name;
  }

  public Person(){
  }

  public String getName(){
    return name;
  }
}
class Worker extends Person{
  protected char[] name;
  public Worker(char[] name){
    this.name = name;
  }

  public String getName(){
    return new String(name);
  }
}

class Main {
  public static void main(String[] args) {
    Person p = new Worker("Adam".toCharArray());
    System.out.println(p.getName());
    System.out.println(p.name);
  }
}

Efekt:
Adam
null

edytowany 1x, ostatnio: cs, 2018-12-18 09:06
Nie uważam, że jedynie słuszne stanowisko, to: zawsze gettery/zawsze pola, o ile są widoczne (niepotrzebne skreślić). Ale powyższy przykład jest wg mnie przykładem na wyższość pól. Wyjście null jest sygnałem dla programisty, że definicje klas są zapewne niewłaściwe. - bogdans 2018-12-18 10:49
Chodziło mi o to, że jeśli w klasach z jakiś powodów są gettery, to trzeba z nich korzystać, jeśli by ich nie było to sygnał, że odczytujemy pola. A null, nie jest sygnałem, że coś nie tak, tylko że klasa jest niekonsekwentna, daje możliwość odczytania pól i są gettery, więc po przykryciu (celowym) odczyt z pola daje null'a. - cs 2018-12-18 11:43

Pozostało 580 znaków

2018-12-18 09:16
0
cs napisał(a):

@bogdans Czy uważasz, że lepiej odwoływać się do pola czy do gettera? Wg mnie lepiej korzystać z getterów, przykład może naciągany, ale ilustruje tę różnicę:

class Person{
  protected String name;
  public Person(String name){
    this.name = name;
  }

  public Person(){
  }

  public String getName(){
    return name;
  }
}
class Worker extends Person{
  protected char[] name;
  public Worker(char[] name){
    this.name = name;
  }

  public String getName(){
    return new String(name);
  }
}

class Main {
  public static void main(String[] args) {
    Person p = new Worker("Adam".toCharArray());
    System.out.println(p.getName());
    System.out.println(p.name);
  }
}

Efekt:
Adam
null

Na siłę to można wszystko udowodnić. Ten przykład ma tyle złych praktyk, że nie ma sensu go rozpatrywać. Jednym z sensowniejszych podejść jest zapewnienie niemutowalności danego pola i odwoływanie się bezpośrednio do niego. W każdym innym przypadku wpierw należy zastanowić się czy getter w ogóle jest potrzebny. W ten sposób możesz łatwo ujawnić wewnętrzny stan danego obiektu narażając go na modyfikację z zewnątrz, a tym samym trudne do określenia błędy

Pozostało 580 znaków

2018-12-18 10:01
cs
0

@DisQ: Obrażasz się na możliwości Javy, nie ja wymyśliłem przykrywanie pól. Wg Ciebie złą praktyką jest robienie pól, które nie są final? Jak w tym przykładzie zmienisz getterem pola name? Była moda na gettery i settery, teraz na bezkrytyczne wciskanie niemutowalności, gdzie tylko się da. Jedno i drugie ma swoje miejsce. Wszyscy patrzą na Jave przez pryzmat webówki, jako jedynie słusznego zastosowania.

Pozostało 580 znaków

2018-12-18 10:11
0

Daleko mi do obrażania się na Javę. Tak, według mnie jeśli tylko można to powinno się robić pola final - mi to ułatwia pisanie kodu, a co ważniejsze - jego czytanie. W twoim przykładzie po prostu bym nie zmieniał pola name, a tym bardziej nie używałbym do tego celu gettera.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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