Cum se utilizează ArrayUtils pentru array de obiecte, nu șterge conținutul unui array (Programare, Java, Array-Uri)

Naufal Yahaya a intrebat.

Cum se șterge conținutul unui array de obiecte. Dacă există și alte modalități de a șterge conținutul unui array de obiecte, vă rugăm să ne împărtășiți.

import java.util.Arrays;
import java.util.Scanner;

import org.apache.commons.lang3.ArrayUtils;

public class Testing {

  public static void deleteItem(ItemTracker[] listItems) {
    System.out.println("Which item you want to delete? ");
    for(int i=0; i < listItems.length; i++) {
            if(input.equalsIgnoreCase("Quantity")) {
                // Some Code
            } else if(input.equalsIgnoreCase("Something"){
                ArrayUtils.remove(listItems, i); //  This is the part where it should delete .. but it doesnt delete. 
            } 
            break;
        }
      }
    }

Comentarii

  • Nu sunt sigur de ce voturile în jos pe cele 3 răspunsuri corecte… –  > Por Gene Gotimer.
  • @CoverosGene Pentru a fi sincer, voturile în jos sunt corecte, deoarece fiecare anwser (cu excepția răspunsului Ilyas) a uitat să menționeze că apelarea ArrayUtils.remove() „singur” nu-l va ajuta aici. De asemenea, el trebuie să schimbe metoda sa pentru a returna noua matrice. –  > Por Tom.
6 răspunsuri
Tom

Schimbați acest lucru

ArrayUtils.remove(listItems, i);

în

listItems = ArrayUtils.remove(listItems, i);

După cum puteți vedea în JavaDoc, , metoda nu modifică argumentul listItems, ci mai degrabă returnează o nouă matrice cu elementele rămase.

Editați

De asemenea, trebuie să schimbați metoda de ștergere în

public static ItemTracker[] deleteItem(ItemTracker[] listItems) {
    //..
}

Pentru a putea returna noul array cu elementele rămase.

Comentarii

  • Ce va face această atribuire? –  > Por bsiamionau.
  • @zvdh Acesta este modul corect de utilizare a lui of ArrayUtils, , dar ai dreptate, nu-l va ajuta prea mult, dacă OP nu-și schimbă deleteItem metoda. –  > Por Tom.
  • @Tom Încercați și tot nu a funcționat, este vreo diferență dacă puneți void sau nu? –  > Por Naufal Yahaya.
  • @NaufalYahaya Este obligatoriu să folosiți ItemTracker[] ca tip de returnare și pentru a apela return listItems în metoda ta. Matricea „originală” la care se face referire prin listItems nu va fi modificat de metoda dvs. de ștergere, prin urmare trebuie să returnați noua matrice creată de către ArrayUtils.remove() pentru a o transmite metodei de apelare. –  > Por Tom.
  • @Tom Am încercat să tipăresc ieșirea, a făcut ștergerea, dar după ce iese din funcție, valoarea este cumva încă acolo. Sunt foarte confuz acum. Ce face de fapt ArrayUtils.remove() în spatele scenei?. și cum pot salva valoarea și să o pun într-o nouă matrice? –  > Por Naufal Yahaya.
JavaLearner

Stocați matricea rezultată.

Nu va modifica obiectul array original.

listItems = ArrayUtils.remove(listItems, i);

Editați: Dar pentru a utiliza această metodă aveți nevoie de schimbarea tipului de returnare a metodei dvs.

public static ItemTracker[] deleteItem(ItemTracker[] listItems){
    System.out.println("Which item you want to delete? ");
    for(int i=0; i < listItems.length; i++) {
            if(input.equalsIgnoreCase("Quantity")) {
                // Some Code
            } else if(input.equalsIgnoreCase("Something"){
                listItems = ArrayUtils.remove(listItems, i); //  This is the part where it should delete .. but it doesnt delete. 
            } 
            break;
        }
      return listItems;
      }

Comentarii

  • Această atribuire este absolut inutilă – va schimba referința metodei locale listItems la noua matrice, dar între timp un consumator al metodei va avea în continuare referința la matricea nemodificată, nu-i așa? –  > Por bsiamionau.
  • @zvdh Cred că sunteți confuz în ceea ce privește referințele. Încercați acest cod în compilatorul dumneavoastră. String x = "abc"; x = x + "def"; Sunteți de acord cu acest exemplu. –  > Por JavaLearner.
  • Vă dați seama că această atribuire nu va avea efect pentru matricea inițială? –  > Por bsiamionau.
  • @DeepakTiwari, ce încerci să-mi explici? Problema abordării dvs. că, de fapt, nu va schimba matricea inițială la toate, , nu o modificați, ci realocați referința la această matrice la o altă matrice nouă. –  > Por bsiamionau.
  • @NaufalYahaya, posibil să existe un alt bug, habar nu am. Noi ți-am dat sfaturi cum să rezolvi exact problema. Acum este rândul tău, încearcă să depanezi metoda. Această grămadă de cod nu este autosuficientă și sunt sigur că problema actuală nu este asociată cu întrebarea inițială. Mult succes! –  > Por bsiamionau.
Ilya

În cazul dvs. utilizarea de ArrayUtils este incorectă și redundantă. Puteți șterge elementul în modul următor:

// ...  
listItems[i] = null;
// array will looks like [o1, o2, null, o3, o4, ...]
// ...    

Nu există altă cale fără a schimba tipul de returnare al metodei.

Comentarii

  • Acest lucru nu șterge elementul. De asemenea, acest lucru poate cauza alte probleme dacă „cineva” ar itera peste acel array fără a verifica dacă există elemente nule. –  > Por Tom.
  • @Tom Nu există altă cale în cazul său. Soluția corectă este de a returna un nou array, în loc să elimine elementele din cel existent –  > Por Ilya.
  • Aceasta este într-adevăr o observație bună. Am actualizat răspunsul meu pentru a menționa acest lucru. Versiunea dvs. ar trebui să funcționeze la. –  > Por Tom.
  • Acest răspuns este corect. Ținând cont de faptul că, în Java, array-urile au o dimensiune fixă, nu putem pur și simplu să eliminăm unul dintre elementele sale, ci trebuie să returnăm un nou array de initial size - 1. Și nu este posibil, deoarece această metodă nu returnează o valoare. –  > Por bsiamionau.
Krzysztof Jabłoński

Fără biblioteci suplimentare, cu listă temporară:

Element arrayToRemoveFrom[];
Element toRemove; // should be known already

ArrayList<Element> tmpList = new ArrayList<Element>(Arrays.asList(arrayToRemoveFrom));
tmpList.remove(toRemove);
// any other code processing and removing elements
arrayToRemoveFrom = tmpList.toArray(new Arrays[tmlList.size()]);

CoderCroc

ArrayUtils.remove

Această metodă returnează un o nouă matrice cu aceleași elemente din tabloul de intrare, cu excepția elementului de pe poziția specificată. Tipul de componentă al tabloului returnat este întotdeauna același cu cel al tabloului de intrare.

Prin urmare, trebuie să o utilizați astfel

listItems = ArrayUtils.remove(listItems, i);

NOTĂ

  • Aici am atribuit matricea returnată la matricea curentă listItem.
  • Deoarece această metodă nu modifică tabloul actual, ci returnează tabloul modificat după eliminare, la fel ca și #replace Metoda funcționează pentru String.

DA. Sunt de acord cu zvdh Am ratat scopul metodei dvs. pentru că am fost mai mult concentrat pe eliminarea elementului.Îmi pare rău pentru asta!!! deoarece acest lucru nu va schimba de fapt listItem și trebuie să return noua matrice care conține modificarea.

Comentarii

  • Ce va face această atribuire? –  > Por bsiamionau.
  • În acest caz, care este scopul acestei metode? –  > Por bsiamionau.
Și
class Arrays
{
    public static void main(String[] args)
    {
      double[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 3.5};
      java.util.Arrays.sort(numbers);

      System.out.print("Ascending order= ");
      for (int i = 0; i < numbers.length; i++)
        System.out.print(numbers[i] + " ");

      System.out.println();

      System.out.print("Decending order= ");
      for (int i = numbers.length -1; i >= 0; i--)
        System.out.print(numbers[i] + " ");

     }

}

Această soluție se afișează numai în ordine inversă, dar poate fi modificată pentru a reordona matricea folosind aceeași buclă.