Diskuze: Arraylist odebrani

Java Java Arraylist odebrani

Avatar
Vojtěch Janoušek:

Ahoj, objevuji krasy arraylistu a chtel bych odstranit objek podle urciteho atributu. Nedari se mi to. mam tohle:

public class Autobazar {

    static ArrayList<IAuto> auto;

    public static void main(String[] args) {
        auto = new ArrayList<> ();
        auto.add(new Auto("BMW", 4, 320, "cerna"));
        auto.add(new Auto("Skoda", 4, 130, "zelena"));
        auto.add(new Auto("Ford", 4, 160, "modra"));
        //auto.add(new Autobus("Skoda", 4, 130, "zelena"));
        //auto.add(new Autobus("Scania", 8, 100, "zluta"));
        vypis(auto);
        System.out.println("");
        odstran(auto);
        vypis(auto);
    }

    private static void vypis(ArrayList<IAuto> auto) {
        for(IAuto a : auto){
            System.out.println("Znacka " + a.getZnacka());
            System.out.println("Pocet kol " + a.getPocetKol());
            System.out.println("Rychlost " + a.getRychlost());
            System.out.println("Barva " + a.getBarva());
        }
    }

    private static void odstran(ArrayList<IAuto> auto) {
        for(IAuto a : auto){
            if(a.getZnacka() == "Skoda"){
                auto.remove(a);
            }
        }

    }

}

Metoda odstran odstrani "Skoda", ale kdyz bych chtel odstranit "ford", tak mi to vyhodi chybu. Proc? Jaky na tohle existuje postup? diky

 
Odpovědět 26.11.2015 13:21
Avatar
Hit
Člen
Avatar
Odpovídá na Vojtěch Janoušek
Hit:

Zkus použít metodu equals, ta se používá pro porovnávání objektů (String je referenční datový typ).

if(a.getZnacka().equals("Skoda"))
Nahoru Odpovědět 26.11.2015 13:28
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
Vojtěch Janoušek:

to mi nabidly netbeansy a taky jsem zkusil, ale stejny. hodi to tohle

run:
Znacka BMW
Pocet kol 4
Rychlost 320
Barva cerna
Exception in thread "main" java.util.Con­currentModifi­cationExcepti­on
Znacka Skoda
Pocet kol 4
Rychlost 130
Barva zelena
Znacka Ford
Pocet kol 4
Rychlost 160
Barva modra

at java.util.Arra­yList$Itr.chec­kForComodifica­tion(ArrayLis­t.java:901)
at java.util.Arra­yList$Itr.nex­t(ArrayList.ja­va:851)
at autobazar.Auto­bazar.odstran(Au­tobazar.java:42)
at autobazar.Auto­bazar.main(Au­tobazar.java:28)
Java Result: 1
BUILD SUCCESSFUL

 
Nahoru Odpovědět 26.11.2015 13:31
Avatar
Hit
Člen
Avatar
Odpovídá na Vojtěch Janoušek
Hit:

Nezkoušel jsem to, ale není to tím, že v inicializaci toho ArrayListu nemáš typ IAuto?

Nahoru Odpovědět 26.11.2015 13:54
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Vojtěch Janoušek
pocitac770:

V tuhle chvíli by se docela hodilo sem hodit i přidružené třídy/interfacy (Auto, IAuto, main)

 
Nahoru Odpovědět 26.11.2015 14:17
Avatar
Odpovídá na Vojtěch Janoušek
Petr Štechmüller:

Hodilo Ti to vyjímku, protože odstraňuješ prvek z právě iterovanýho seznamu, což je velký problém. Pokud to chceš odstranit, tak mě napadají tři moznosti, jak to řešit:

  1. Vytvořit si nový arrayList, který bude obsahovat všechny položky, které chceš odstranit. Po naplnění tohoto listu, můžeš zavolat nad originálním listem metodu removeAll, která bere jako parametr jinou kolekci.
  2. Můžeš vytvořit iterátor, kterým to bezpečně "proiteruješ". V iterátoru můžeš prvky normálně odebírat pomocí metody remove.
  3. Můžeš využít lambda výrazy:
auto.stream().filter(a -> a.getZnacka().equals("Skoda")).forEach(auto::remove);

To Hit:

Nezkoušel jsem to, ale není to tím, že v inicializaci toho ArrayListu nemáš typ IAuto?

ArrayList je o řádek výše deklarován na typ IAuto, proto při inicializaci může psát pouze new ArrayList<> ();
Říká se tomu Diamond Operator

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 26.11.2015 14:21
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Janoušek:

Díky Petře za pomoc. Ty lambda vyrazy mi vubec nic nerikaji. Bod cislo jedna me napadl taky. Vyřešil jsem to takhle. Přijde mi to kostrbaté. Dá se ještě jinak prolézat Arraylist a hledat podle atributů objeku? Kdyb to někoho zajímalo, dopadlo to takhle:

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author janousekv
 */
public class Autobazar {

    public static ArrayList<IAuto> auto;

    public static void main(String[] args) {
        auto = new ArrayList<>();
        auto.add(new Auto("BMW", 4, 320, "cerna"));
        auto.add(new Auto("Skoda", 4, 130, "zelena"));
        auto.add(new Auto("Ford", 4, 160, "modra"));
        //auto.add(new Autobus("Skoda", 4, 130, "zelena"));
        //auto.add(new Autobus("Scania", 8, 100, "zluta"));
        vypis(auto);
        System.out.println("");
        odstran(auto);
        vypis(auto);
    }

    private static void vypis(ArrayList<IAuto> auto) {
        for (IAuto a : auto) {
            System.out.println("Znacka " + a.getZnacka());
            System.out.println("Pocet kol " + a.getPocetKol());
            System.out.println("Rychlost " + a.getRychlost());
            System.out.println("Barva " + a.getBarva());
        }
    }

    private static void odstran(ArrayList<IAuto> auto) {
        Iterator<IAuto> iter = auto.iterator();
        while (iter.hasNext()) {
            if (iter.next().getZnacka().equals("Ford")) {
                iter.remove();
            }
        }
    }

}
 
Nahoru Odpovědět 26.11.2015 15:59
Avatar
Odpovídá na Vojtěch Janoušek
Petr Štechmüller:

Já vím pouze o těchto třech metodách. Jinak nevím, co se Ti na tom zdá kostrbaté. Iterátor máš použitý dobře.

Nahoru Odpovědět 26.11.2015 16:42
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.