Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Java - hledání duplicit v poli - Optimalizace kódu

Dobrý den,

V podstatě to navazuje na 1769795-java-hledani-duplicit-v-poli

Akorát teď mám následující kód.

public void check_diffrents(ObjectArrayList<Player> color_player, int number) {
        ObjectOpenHashSet hash = new ObjectOpenHashSet();
        for (int i = 0; i < number; i++) {
            hash.add(color_player.get(i).getFill());
        }
        setDisable(number != hash.size());
}

ObjectArrayList a ObjectOpenHashSet je to samé jako ArrayList a HashSet, akorát jsou to třídy extérní knihovny.

Tady porovnávám property objektů, takže nemůžu napsat.

ObjectOpenHashSet hash = new ObjectOpenHashSet(color_player);

Jenže počet porovnávaných prvků, určující proměnná number, nemůžu předem znát a proto to musím napsat do cyklu.

Existuje, prosím vás, nějaký optimálnější způsob, kde bych nemusel používat cyklus.

Děkuji

loading...
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
.. optimalizovat sa da hladanie duplicit tak ze si to zoradujes a potom pri hladani noveho oproti us… nový
MM.. 13.10.2017 00:01
MM..
Ak uvažujeme, že HashSet.add sa blíži k O(1), tak zložitosť jeho algoritmu je O(N). Takže ak by to m… nový
los 13.10.2017 00:50
los
Ten add to musi prehladat aby vedel ci sa to tam uz vyskytuje, takze to bude skor N a ne 1. (ak si t… nový
MM.. 13.10.2017 00:53
MM..
To je HashSet, čiže hešovacia tabuľka, takže pri pridávaní nemusí prehľadávať celý obsah. Za zvyčajn… nový
los 13.10.2017 01:07
los
Jediná optimalizácia, ktorá sa tam dá spraviť, je ukončenie cyklu v prípade, že metóda add vráti fal… nový
los 13.10.2017 00:45
los
A co tohle? public void check_diffrents(ObjectArrayList<Player> color_player, int number) { ObjectO… nový
MichalDM 13.10.2017 22:38
MichalDM
Neviem síce, prečo si vymenil poradie prechádzania prvkov v tom for cykle, ale pridaj tam podmienku… nový
los 14.10.2017 00:23
los
Pokud umi ta tvoje kolekce z externi knihovny streamy, tak se muzes na oko zbavit cyklu pri tvorbe t… nový
MaSo 14.10.2017 07:08
MaSo
Díky, tohle jsem potřeboval. (Hlavně že jsem stream před týdnem používal). public void check_diffre… nový
MichalDM 14.10.2017 16:12
MichalDM
Tak ještě jsem to upravil, poněvadž jsem to nedostatečně otestoval a teď jsem zjistil, že parametr n… nový
MichalDM 14.10.2017 23:15
MichalDM
Sice ses vyhnul cyklu, ale tipnul bych si, že jsi to tímhle ve skutečnosti o něco zpomalil. nový
Wikan 15.10.2017 08:58
Wikan
Ale no tak, beztak tam ma 10 prvku, o tolik pomalejsi to zas nebude...:-) Pokud ma 10 milionu, tak m… nový
MaSo 15.10.2017 09:03
MaSo
Pro 10 prvků nemá smysl optimalizovat ani úplně první zápis. nový
Wikan 15.10.2017 09:05
Wikan
Ja to chapal tak, ze chce hezci kod bez cyklu. Ne, ze ma problemy s performance... EDIT: ale ten ko… poslední
MaSo 15.10.2017 09:06
MaSo
public void check_diffrents(ObjectArrayList<Player> color_player, int number) { ObjectOpenHashSet ha… nový
Wikan 14.10.2017 08:46
Wikan

.. optimalizovat sa da hladanie duplicit tak ze si to zoradujes a potom pri hladani noveho oproti usporiadanemu zoznamu sa da dosiahnut tusim len zlozitost O(N*log(N) ci kolk oneviem zhlavy som 20rokov po univezite :D). Ci tvoja kniznica ma implementovany usporiadany zoznam a jeho hladanie netusim. Ale cyklus tam byt musi aspon jednoduchy (pre to normalne riesenie O(N^2) by bol cyklus dvojity vnoreny)

Ten add to musi prehladat aby vedel ci sa to tam uz vyskytuje, takze to bude skor N a ne 1. (ak si to ten set zoraduje, tak to moze ist k tomu log(N) o ktorom som pisal). Prehladavat zoradeny zoznam je optimalnejsie jak prehladavat nezoradeny (zoradovat to nebude extra, staci ak to vklada na spravne miesta)

A co tohle?

public void check_diffrents(ObjectArrayList<Player> color_player, int number) {
        ObjectOpenHashSet hash = new ObjectOpenHashSet();
        try {
          setDisable(false);
          for (int i = number - 1; ; i -= 1) {
            if (!hash.add(color_player.get(i).getFill())) {
               setDisable(true);
               break;
            }
          }
        } catch (ArrayIndexOutOfBoundsException e) {
        }   
}

Díky, tohle jsem potřeboval. (Hlavně že jsem stream před týdnem používal).

public void check_diffrents(ObjectArrayList<Player> color, int number) {
         ObjectSet<Paint> original_color = new ObjectOpenHashSet(color.stream().map(Player :: getFill).collect(Collectors.toSet()));
         setDisable(original_color.size() != number);
}

Tak ještě jsem to upravil, poněvadž jsem to nedostatečně otestoval a teď jsem zjistil, že parametr number vůbec nepoužívám a proto to nefunguje 100% dobře.

public void check_diffrents(ObjectArrayList<Player> color, int number) {
        ObjectSet<Paint> pure_color = new ObjectOpenHashSet(color.stream().limit(number).map(Player :: getFill).collect(Collectors.toSet()));
        setDisable(pure_color.size() != number);
}

Zpět do poradny Odpovědět na původní otázku Nahoru

loading...