• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Java - tablice, zmiana liczby elementów na mniejszą

VPS Starter Arubacloud
0 głosów
2,113 wizyt
pytanie zadane 27 lutego 2017 w Java przez Jedyn Obywatel (1,200 p.)
zamknięte 27 lutego 2017 przez Jedyn

Witam. Mam problem, ponieważ piszę program który bazuje na tablicy int z liczbą elementów podanych parametrem w konstruktorze. Chcę napisać metodę, która zmienia liczbę tych elementów z tym ,że jeżeli w metodzie podamy liczbę mniejszą od liczby poprzednich elementów to automatycznie mam wypełnić tablicę tylko tymi elementami które się mieszczą (w kolejności od 0 elementu), a resztę odrzucić. I teraz pytanie, w jaki sposób mam ową metodę napisać? Stworzyć jakąś inną tablicę do której będę sobie "chował" elementy gdy będę uruchamiał tą metodę i zwyczajnie dam pętle for(int i = 0; i<nowaLiczbaElementow;i++) {tablica[i] = kopiaWiekszejTablicy[i]} czy jest jakiś bardziej elegancki sposób? Dodam ,że przesiadam się dopiero z C++ i trochę jeszcze nie ogarniam.
Mam obecnie coś takiego: 

 

protected void ustawRozmiar(int rozmiar)
	{
		if(rozmiar>ileElementow)
		{
			for(int i=ileElementow;i<rozmiar;i++)
			{
				tablica[i]=0;
			}
		}
        else if(rozmiar<1) System.out.println("Tablica nie moze miec 0 elementow");
		else 
		{
			int[] tab = new int[ileElementow];
			for(int i=0;i<ileElementow;i++)
			{
				tab[i] = tablica[i];
			}
			for(int i=0;i<rozmiar;i++)
			{
				tablica[i]=tab[i];
			}
		}
		ileElementow=rozmiar;
	}
		
	}

 

komentarz zamknięcia: Problem rozwiązany

2 odpowiedzi

+1 głos
odpowiedź 27 lutego 2017 przez Szary Mary Użytkownik (500 p.)
wybrane 27 lutego 2017 przez Jedyn
 
Najlepsza

Stwórz funkcję, która jako parametr przyjmuje tablicę i ilość elementów, które chcesz skopiować. Niech kopiuje ona elementy od 0 do tego parametru w tablicy. Na koniec zwróć tę tablicę i powinno banglać. Będzie to wyglądać mniej więcej tak:

public int[] copyTable(int [] table, int length){
int[] newTable[length];
for (int i = 0; i < length; i++){
newTable[i] = table[i];
}
return newTable;
}

W tym momencie, po wywołaniu funkcji, masz zwróconą nową tablicę z elementami, które Cię interesują.

Pozdrawiam

komentarz 27 lutego 2017 przez Jedyn Obywatel (1,200 p.)
edycja 27 lutego 2017 przez Jedyn
Zgadza się tylko, że jak odwołam się do tablicy stworzonej dynamicznie w konstruktorze to nic się nie zmieni, funkcja ta zwróci mi nową tablice a nie zmieni tej na której operuje w zadaniu.  Chce po prostu zmienić liczbę przechowywanych tam elementów na większą lub mniejsza przy zachowaniu podanej nowym parametrem liczby argumentów.

Edit. Doczytałem że będą potrzebne mi listy.
komentarz 27 lutego 2017 przez Szary Mary Użytkownik (500 p.)

Okej, widocznie, że nie zrozumiałem. W takim przypadku tak jak napisałeś - będzie potrzebna lista/arraylista. W swojej głównej klasie będziesz miał listę którą inicjalizujesz w konstruktorze. Arraylista zmienia swoją wielkość w zależności od posiadanych elementów, czyli za każdym razem gdy odwołasz się do <nazwaArrayListy>.size() zwróci Ci ona wielkość listy. Na liście możesz wywoływać metody takie jak add, get, remove. Tutaj masz przykładową klasę korzystająca z listy:

package com.company;

import java.util.ArrayList;
import java.util.List;

public class ArrayTest {
    private List<Integer> collection;

    public ArrayTest(){
        collection = new ArrayList<Integer>();
    }

    public void addElement(int element){
        collection.add(element);
    }

    public int getElement(int index){
            return collection.get(index);
    }

    public void removeElement(int index){
        collection.remove(index);
    }

    public List getCollection(){
        return collection;
    }

    public void showCollection(){
        for(int e : collection)
            System.out.println(e);
    }
}

 

komentarz 27 lutego 2017 przez Jedyn Obywatel (1,200 p.)
Dzięki wielkie ;). Przerabiam zadania, które robiłem w C++ i polecenie "..zadeklaruj dynamicznie tablice int" zbiło mnie całkowicie z tropu.
komentarz 2 marca 2017 przez Wojciech Cies Obywatel (1,140 p.)
Podane rozwiązanie wywróci się, jeżeli podane length będzie większe niż oryginalny rozmiar tablicy...

Ciężko dojść do tego czego oczekujesz, bo podałeś jedną klasę. Nie wiemy o co chodzi z tym konstruktorem. Może szerszy przykład kodu albo pełny tekst zadania?
komentarz 2 marca 2017 przez Jedyn Obywatel (1,200 p.)
Dokładnie chodzi mi o zadanie 1, są to zadania które dostawałem ucząc się c++.
http://docdro.id/ml5OSRE
+1 głos
odpowiedź 27 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Trosze cieżko się czyta twój kod bez szerszego kontekstu.

Pierwszy if. Nie zabardzo rozumiem co chcesz tam zrobić. Jeśli chcesz powiekszyc tablice to musisz stworzyć nową wiekszą i przepisać starą na nową. Nie musisz martwić się zerowanie bo w Javie wartosci domyslne to 0.

W elsie też nie rozumiem co robisz. Napoczatku tworzysz tablice do ktorej zapisujesz jakieś wartosci, potem z tej tablicy zapisujesz spowrotem do tej z ktorej te wartosci pobrales tylko mniej. Wiec generalnie konczysz z tablica ktora jest taka sama. Nic sie nie zmienia.

Jeśli chcesz zmienniac wielkosc tablicy to najlepiej jest tworzyc nową. Bo teraz mam wrażenie jak byś chciał mieć jedną gigantyczna tablice i jakąś zmmienną opisywać jej wielkość. Co nie jest dobrym rozwiazaniem.

Wydaje mi się że funkcja Arrays.copyOf() wykonuje to co chcesz osiągnąć. Polecam spojrzeć w jej implementacje.
komentarz 27 lutego 2017 przez Jedyn Obywatel (1,200 p.)
W pierwszym if rozpatruje sytuację w której podany rozmiar tablicy będzie większy od tego w konstruktorze czyli zaczynam uzupełniać/rozszerzać ja od elementu największego wzwyż do [rozmiar-1.] uzupełniając przy tym zerami.

 W else rozpatruje gdy nowy parametr jest mniejszy niż ten podany w konstruktorze, czyli zacząłem kombinować i postanowiłem, że stworzę drugą tablice z ilością elementów taka jak konstruktor, przepisze sobie wszystkie elementy a następnie do pierwszej tablicy przepisze tylko "rozmiar" elementów,  ale już widzę, że był to zły sposób. Lecę poczytać o Arrays.copyOf. Dzięki za podpowiedź! :)

Podobne pytania

0 głosów
4 odpowiedzi 1,177 wizyt
pytanie zadane 7 listopada 2018 w Java przez Tom_Ja Dyskutant (7,970 p.)
0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 4 kwietnia 2021 w Java przez Hubert731 Obywatel (1,650 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...