Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 80% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
birthday

Diskuze: Arraylist odebrani

Aktivity (3)
Avatar
Vojtěch Janoušek:26.11.2015 13:21

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:26.11.2015 13:28

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:26.11.2015 13:31

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:26.11.2015 13:54

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.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Vojtěch Janoušek
pocitac770:26.11.2015 14:17

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
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Vojtěch Janoušek
Petr Štechmüller:26.11.2015 14:21

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
26.11.2015 14:21
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Vojtěch Janoušek:26.11.2015 15:59

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
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Vojtěch Janoušek
Petr Štechmüller:26.11.2015 16:42

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.