Cum puteți schimba dimensiunea unei matrice?

Cum Puteți schimba dimensiunea unei matrice?

DIV id = „E6B9DE9D2C”>

iv id = „e6b9de9d2c”

Răspunsul este un nr. În Java nu puteți schimba dimensiunea unui aranjament.

Dar înainte de a explica de ce, trebuie să fim clar că înseamnă a schimba dimensiunea unui aranjament.

Să ne uităm la următoarea imagine: Diagrama memoriei

sursa: https://overiq.com/c-programming-101/the-realloc-function-in-c/

în imaginea pe care o găsim au la început un aranjament de 5 elemente de tip integer dar apoi doriți să creșteți 6 spații de memorie în aranjament. Apoi, schimbați dimensiunea unei matrice pur și simplu înseamnă a mări sau micșora numărul de spații de memorie pe care o are un aranjament. În blocul nostru de memorie din amonte, dimensiunea matricei la 11 elemente, totuși, același bloc va fi păstrat memoria atâta timp Ca urmare a ultimului element de aranjament, nu există spațiu de memorie ocupat, deoarece dacă se întâmplă acest lucru, trebuie rezervat un nou bloc de memorie și apoi elementele vechiului bloc trebuie copiate la noul.

deja ,. .. pentru razele pe care le-am menționat toate cele de mai sus?

De ce să realizăm dimensiunea unui aranjament este necesară o funcție / rutină care poate crește sau micșora cantitatea de elemente ale unui bloc de memorie. În Java nu există o astfel de metodă, totuși, în alte limbi de programare ca limbă C, dacă aveți o astfel de funcție și se numește realloc.

De ce nu puteți schimba dimensiunea unui matrice?

De ce nu are o funcție ca Realloc, altfel, dacă ar putea fi redimensionat un aranjament.

De asemenea, subliniez că mulți oameni cred că redimensionarea unui aranjament înseamnă crearea unui nou aranjament și copierea Elemente ale aranjamentului anterior în noul, cu toate acestea, este incorect. Un exemplu excelent este metoda redimensionată de C #, oricine ar crede că redimensionează un aranjament, dar în realitate nu este așa, face aceeași procedură pe care am menționat-o mai sus. Numele metodei este înșelător.

Redimensionarea unui aranjament înseamnă schimbarea dimensiunii aranjamentului, dar păstrarea aceluiași bloc de memorie (unde sunt găzduite elementele de matrice).

acum, a Soluții simple Pentru a putea înregistra numele persoanelor inevitabile ale dimensiunii aranjamentului, acesta utilizează clasa arrailistă și, în acest fel, puteți crea o listă de tip .

De exemplu:

public class Program { public static void main(String args) { Scanner sc = new Scanner(System.in); String namePerson; List<String> listPerson = new ArrayList<String>(); int op; do { System.out.println("Ingrese un nombre:"); namePerson = sc.nextLine(); listPerson.add(namePerson); System.out.println("Desea salir? Presione (-1)"); op = sc.nextInt(); sc.nextLine();//para limpiar el buffer stdin if(op == -1) break; }while(true); for(int i = 0; i != listPerson.size(); ++i) { System.out.println(listPerson.get(i)); } }}

clasa ArrayList Implementat-o printr-un vector / aranjament dinamic, acest lucru înseamnă , atunci când creați un obiect de tip ArrayList iv id = „774294EC3”

De fapt, constructorul de acest tip este responsabil pentru crearea aranjamentului dinamic cu o capacitate inițială (cod sursă arrailistă) de elemente

, acest lucru ne spune că intern această clasă are referire la un aranjament pentru elemente X, dar nu are orice Referință a unui obiect (din acest motiv, dacă metoda de dimensiune () va fi executată, ar trebui să ducă la elemente 0).

Cu toate acestea, clasa ArrayList nu crește dimensiunea aranjamentului dinamic în care se stochează, prin urmare, referințele fiecărui obiect, atunci când numărul de obiecte depășește capacitatea maximă a listei, ceea ce se va întâmpla este că memoria va fi Fiți rezervat pentru un nou aranjament, în care elementele blocului vechi vor fi copiate în noul bloc de memorie.

Deci, dacă profesorul dvs. nu vă va lăsa să utilizați clasa ArrayList, ați putea crea propria dvs. clasă în care este responsabilă pentru emularea implementării unui

.

De exemplu:

class ArrayPerson{ private String person; private int capacity; private int count; public ArrayPerson() { person = new String; capacity = 10; } public ArrayPerson(int capacity) { this.capacity = capacity; person = new String; } //Obtiene la cantidad actual de objetos reservados en el arreglo public int getCount() { return count; } //Para obtener la referencia donde está el arreglo por completo public String getPersons() { return person; } //Para obtener la referencia de X objeto de tipo String del mismo arreglo public String getPerson(int index) { return person; } //Inserta una referencia de un objeto de tipo String en el arreglo public void add(String refPerson) { ++count; if(count > capacity) { capacity += 10; person = Arrays.copyOf(person, capacity); } person = refPerson; }}

Practic în această clasă Când ajungeți la instant, vă oferă posibilitatea de a rula un constructor parametrizat sau implicit.

Dacă conducem constructorul parametrizat :

  • va crea Un aranjament de obiecte cu o dimensiune care va depinde de valoarea parametrului constructorului.

Dacă rulați constructorul implicit (fără parametri):

  • Va crea un aranjament obiect cu o dimensiune implicită (cu o capacitate inițială maximă de 10

acum vine cea mai interesantă parte, Metoda add.Această metodă va fi responsabilă pentru adăugarea unei referințe (adresa de memorie) în poziția X a matricei de obiecte, totuși atunci când numărul de obiecte depășește capacitatea maximă de capacitate, va fi calculată o nouă capacitate și metoda copierii clasei Arrays și ce face această metodă este de a rezerva memorie pentru un nou aranjament de obiecte, în care acesta va copia elementele vechiului bloc în noul bloc de memorie și care returnează această metodă este Referință la un obiect de tip String în care referința obiectelor (cu o dimensiune a elementului actualizat) va fi internă.

Forma de utilizare a acestei clase ar fi Fii în acest fel:

public class Program { public static void main(String args) { Scanner sc = new Scanner(System.in); String namePerson; //Instaciamos la clase ArrayPerson ArrayPerson ap = new ArrayPerson(); int op; do { System.out.println("Ingrese un nombre:"); namePerson = sc.nextLine(); //Añadimos la referencia del objeto al arreglo ap.add(namePerson); System.out.println("Desea salir? Presione (-1)"); op = sc.nextInt(); sc.nextLine();//para limpiar el buffer stdin if(op == -1) break; }while(true); //Recorremos el arreglo con los elementos que tenga registrado el arreglo for(int i = 0; i != ap.getCount(); ++i) { System.out.println(ap.getPerson(i)); } }}

Concluzie:

În Java nu puteți crește dimensiunea aranjamentului, dar dacă puteți rezerva memoria Pentru un nou bloc de memorie în care copiem elementele vechiului bloc în noul bloc și pentru a nu face acest lucru Sau aceeași procedură de fiecare dată când doriți să introduceți un element nou în aranjament, o facem atunci când cantitatea de elemente depășește capacitatea maximă a matricei (deoarece clasa are ).

Recomandare:

Este întotdeauna bine să folosească clasele care aparțin API Java, deoarece economisește munca în scopuri academice, nu ar fi greșit să implementeze propriile dvs. clase.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *