Warunek w pętli for

0

Witam, przerabiam zadanko podstaw programowania obiektowego. Moim problemem jest metoda dodajElement, nie mam żadnej koncepcji na stworzenie odpowiedniego warunku by pętla for mogła odpowiednio działać. Nie chce gotowego rozwiązania tylko jakieś podpowiedzi. Zadanie poniżej
https://zapodaj.net/36a42a8b754e6.jpg.html

package pl.samprojektuje.naukajava;

import java.io.File;

public class main {

    public static void main(String[] args) {
    Lista l = new Lista(5);
    for (int i = 0; i<5;++i){
        l.dodajElement((1<<i));
    }





    }
}

package pl.samprojektuje.naukajava;


public class Lista {

    private int liczby[];
    private int pojemność;
    private int rozmiar;

    Lista(int pojemność) {
        this.pojemność = pojemność;
        this.liczby = new int[pojemność];
        this.rozmiar = 0;
    }

    public int dodajElement(int liczbaDodawana) {

        for (int i = 0;i < liczby.length;i++){
            liczby[i] = liczbaDodawana;
            rozmiar++;
            if(rozmiar>pojemność){
                System.out.println("Nie można dodać więcej elementów lista pełna! ");
            }
        }
        return liczbaDodawana;

    }


}
Przykładowo, po wykonaniu poniższego fragmentu:
final int N = 10;
Lista l = new Lista(N);
for (int i = 0; i < N/2; ++i) {
l.dodajElement( (1 << i) );
}
l.dodajElement(2);
l.dodajElement(8);
l.pisz();
l.usunPierwszy(2);
l.pisz();
for (int i = 0; i < N/2; ++i) {
l.dodajElement( (1 << i) );
}
l.pisz();
System.out.println("Po usunięciu powtórzeń:");
l.usunPowtorzenia();
l.pisz();
Na ekranie powinno zostać wyświetlone:
Lista:
Pojemność: 10
Rozmiar: 7
Elementy: 1 2 4 8 16 2 8
Lista:
Pojemność: 10
Rozmiar: 6
Elementy: 1 4 8 16 2 8
Nie można dodać więcej elementów, lista pełna!
Lista:
Pojemność: 10
Rozmiar: 10
Elementy: 1 4 8 16 2 8 1 2 4 8
Po usunięciu powtórzeń:
Lista:
22
Pojemność: 10
Rozmiar: 5
Elementy: 16 1 2 4 8

1

Nie potrzebujesz pętli w metodzie dodajElement ponieważ rozmiar określa liczbę dodanych już elementów a tym samym miejsce w tablicy liczby gdzie powinien zostać dodany nowy element. Jeśli rozmiar == pojemność to wtedy tablica jest zapełniona i rzucasz błąd.

0
    public int dodajElement(int liczbaDodawana) {
        liczby[rozmiar++] = liczbaDodawana;
            if(rozmiar==pojemność){
                System.out.println("Nie można dodać więcej elementów lista pełna! ");
        }
        return liczbaDodawana;

    }


}

Chyba dobrze zrozumiałem, bo działa :)

0

Tylko jeszcze sprawdzaj pojemność zanim dodasz element - teraz wykrywasz przepełnienie przy dodawaniu na ostatnie wolne miejsce, a błąd powinien być wyświetlany dopiero przy następnej próbie dodania.

Edit: Chyba że po prostu ma być wyświetlana informacja po zapełnieniu ostatniego wolnego miejsca, wtedy jest okej to co masz

0

Jeszcze mam takie jedno pytanie odnośnie metody usuńPierwszy:
Metoda usunPierwszy , która usuwa pierwsze wystąpienie podanej jako parametr
liczby, jeżeli znajduje się ona na liście, tzn. jeżeli podana liczba występuje więcej
niż jeden raz, to usuwane jest jedynie pierwsze jej wystąpienie;

Przy użyciu kolekcji set, nie było by problemu, a na samej tablicy już się robi problem. Jedyny pomysł jaki mi przychodzi do głowy to użycie dwóch pętli for, ale przy analizie jestem w kropce.

0

Potrzebujesz jednej pętli - jedziesz nią po tablicy od 0 do rozmiar - 1 aż znajdziesz dany element, wtedy musisz ten fakt zapamiętać, zmniejszyć rozmiar i już w kolejnych iteracjach pętli przepisywać bieżący element na poprzednie miejsce tak, żeby zapełnić "lukę" (liczby[i - 1] = liczby[i])

0

Na pewno jedna pętla wystarczy? Z Twojego opisu wynika, że "zmniejszyć rozmiar i już w kolejnych iteracjach pętli przepisywać biężacy element na poprzednie miejsce".

0

Witam, tym razem mam problem z metodą Pisz, która wypisuje elementy tablicy, podając rozmiar oraz listę przechowywanych elementów. Mój problem to wyświetlenie elementów po usunięciu duplikatu w metodzie usunPierwszy. Metoda Pisz wypisuje tylko elementy z tablicy, którą stworzyłem na początku, nie po modyfikacjach. Mój kod poniżej:

package pl.samprojektuje.naukajava;


import java.sql.SQLOutput;
import java.util.Arrays;

public class Lista {

    private int[] liczby;
    private int pojemność;
    private int rozmiar;

    Lista(int pojemność) {
        this.pojemność = pojemność;
        this.liczby = new int[pojemność];
        this.rozmiar = 0;
    }

    int dodajElement(int liczbaDodawana) {
        if (rozmiar == pojemność) {
            System.out.println("Nie można dodać więcej elementów lista pełna!  ");
        }
        liczby[rozmiar++] = liczbaDodawana;
        return liczbaDodawana;

    }


    int znajdź(int szukanaLiczba) {

        for (int i = 0; i < rozmiar; i++) {

            if (liczby[i] == szukanaLiczba) {
                return i;
            }

        }

        return -1;
    }


    String pisz() {
        String atrybutyListy = String.format("Lista: \n pojemność:  %d  \n rozmiar:   %d \n Elementy: ", pojemność, rozmiar);
        System.out.print(atrybutyListy);
        for (int i = 0; i < rozmiar; i++) {
            System.out.print(liczby[i] + " ");
        }
        System.out.println(" ");

        return atrybutyListy;


    }

    void usunPierwszy(int liczbaUsuwana) {
        int indexPowtórzenia = 0;
        int ileRazy = 0;
        for (int i = 0; i <liczby.length; i++) {
            if (liczby[i] == liczbaUsuwana) {
                ileRazy++;

                if (ileRazy == 2) {
                    break;
                }
                indexPowtórzenia = i;

            }
        }
        int[] nowaTablica = new int[rozmiar - 1];
        int n = 0;
        for (int k = 0; k <rozmiar-1; k++) {
            nowaTablica[k] = liczby[k + n];
            if (indexPowtórzenia == k) {
                n = 1;
                nowaTablica[k] = liczby[k + n];
            }
        }

    }
package pl.samprojektuje.naukajava;

import java.io.File;

public class main {

    public static void main(String[] args) {
    Lista l = new Lista(10);
    for (int i = 0; i<5;++i){
        l.dodajElement((1<<i));
    }
    l.dodajElement(2);
    l.dodajElement(8);
    l.pisz();
    l.usunPierwszy(2);
    l.pisz();








    }
}
1

W metodzie usunPierwszy tworzysz nową tablicę, która jest zmienną lokalną. Do niej przepisujesz wszystkie wartości z tablicy liczby oprócz liczbaUsuwana, ale nie zwracasz tej nowej tablicy, ani nie modyfikujesz tej oryginalnej liczby. Kiedy, więc następnie używasz metody pisz to ona nic nie wie o tej zmiennej lokalnej w metodzie usunPierwszy, więc ponownie wypisuje wartości z oryginalnej tablicy liczby.

0

Hmm, zrobienie z metody void usunPierwszy, metody, która zwraca tablice nie jest problemem. Nie rozumiem tylko jak mam zmodyfikować tablice liczby, skoro są już tam elementy??

0
jasper93 napisał(a):

Hmm, zrobienie z metody void usunPierwszy, metody, która zwraca tablice nie jest problemem. Nie rozumiem tylko jak mam zmodyfikować tablice liczby, skoro są już tam elementy??

Niestety nie da się dodać kolejnego elementu do tablicy. Tablice mają stały rozmiar, nie da się go modyfikować.
Jeśli na potrzeby zadania musisz operować na tablicy to musisz utworzyć nową tablicę podczas każdego dodawania nowego elementu, która będzie zawierać wszystkie elementy z pierwotnej tablicy + nowy element.
Szczerze? Wychodzi z tego naprawdę duży przerost formy nad treścią.
Zdecydowanie lepiej skorzystać z

java.util.ArrayList

Polecam poczytać o tej klasie (Zastanów się czy nie wykorzystać Initial Capacity):
https://www.baeldung.com/java-arraylist

0

Właśnie dla mnie to totalnie bez sensu, a zapewne autor zadania miał na myśli, żeby operować na tablicy, która będzie przypominała liste, skoro sama klasa ma taką nazwę. Teraz przy każdej metodzie musiałbym modyfikować tablice.

1

Nie wiem jaka jest treść zadania i co tam dokładnie jest do osiągnięcia. Z tego co widzę w metodzie dodajElement masz zabezpieczenie przed dodaniem zbyt wielu elementów, więc można chyba pozostać przy tablicy jeśli takie są założenia zadania. W metodzie usunPierwszy jeśli chcesz usunąć z tablicy element o indeksie n możesz zmodyfikować oryginalną tablicę i pod indeksem n wstawić wartość spod n+1, pod indeks n+1 wartość spod n+2 itd.

EDIT: Przy tym oczywiście wypadałoby też zmodyfikować pole rozmiar.

0
pleome napisał(a):

Nie wiem jaka jest treść zadania i co tam dokładnie jest do osiągnięcia. Z tego co widzę w metodzie dodajElement masz zabezpieczenie przed dodaniem zbyt wielu elementów, więc można chyba pozostać przy tablicy jeśli takie są założenia zadania. W metodzie usunPierwszy jeśli chcesz usunąć z tablicy element o indeksie n możesz zmodyfikować oryginalną tablicę i pod indeksem n wstawić wartość spod n+1, pod indeks n+1 wartość spod n+2 itd.

EDIT: Przy tym oczywiście wypadałoby też zmodyfikować pole rozmiar.

Z usunięcia pierwszego 1), zresztą z dodania, nie jest zwracana żadna sensowna informacja, że (odnoście usuwania) jeszcze są następne, że dodawanie sie udało/nie.
Returny (i typy) metod są zupełnie nie przemyślane.
Ja bym użył wyjątków z czytelnym opisem - ale również nie wiem, jaka jest treść nie zniekształconego jest zadania, wiec być może nie.

  1. całkiem może być, że nazwa jest zła
0
pleome napisał(a):

Nie wiem jaka jest treść zadania i co tam dokładnie jest do osiągnięcia. Z tego co widzę w metodzie dodajElement masz zabezpieczenie przed dodaniem zbyt wielu elementów, więc można chyba pozostać przy tablicy jeśli takie są założenia zadania. W metodzie usunPierwszy jeśli chcesz usunąć z tablicy element o indeksie n możesz zmodyfikować oryginalną tablicę i pod indeksem n wstawić wartość spod n+1, pod indeks n+1 wartość spod n+2 itd.

EDIT: Przy tym oczywiście wypadałoby też zmodyfikować pole rozmiar.

Jeśli metodę usunPierwszy mogę tak zmodyfikować, to metoda usunPowtórzenia tez jest do poprawy..Bo tez tworze nową tablice, gdzie przepisuje elementy bez duplikatów.

0

dodałem break, po wyświetleniu komunikatu o przepełnieniu tablicy, więc myślę, że powinno być ok :)

Jak już to return, a nie break. Pytanie tylko co w tym momencie powinno być zwrócone z metody. Czy ta sama liczba, którą próbowałeś dodać? Trochę bez sensu. Poza tym wynik będzie taki sam, nie ważne czy uda się dodać liczbę do tablicy czy nie. Tak jak napisał kolega wyżej musisz przemyśleć co mają zwracać Twoje metody. Może warto np. zwrócić true w przypadku powodzenia i false w przeciwnym przypadku. Może w ogóle nic nie zwracać jeśli i tak ignorujesz zwracaną wartość. Musisz to sobie przemyśleć w kontekście swojego zadania.

jasper93 napisał(a):

[...]
Jeśli metodę usunPierwszy mogę tak zmodyfikować, to metoda usunPowtórzenia tez jest do poprawy..Bo tez tworze nową tablice, gdzie przepisuje elementy bez duplikatów.

Nie widzę metody usunPowtorzenia na listingu. Jeśli założenia są takie, że obiekt typu Lista ma trzymać stan, to wszystkie metody powinny operować na tablicy liczby, aby widziały te same dane.

0

Jeśli chodzi o metodę dodajElement, to lepiej zmodyfikować jej funkcjonalność, jeśli rozmiar == pojemność, wtedy zadeklarować tablicę o większym rozmiarze, tak by mogła działać jak typowa arraylista.

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