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...
Předmět Autor Datum
Niekde ten cyklus bude musiet byt. Ci je v kniznici alebo v tvojom kode je uplne jedno. (...zlozitos…
MM.. 12.10.2017 23:56
MM..
.. optimalizovat sa da hladanie duplicit tak ze si to zoradujes a potom pri hladani noveho oproti us…
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…
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…
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…
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…
los 13.10.2017 00:45
los
A co tohle? public void check_diffrents(ObjectArrayList<Player> color_player, int number) { ObjectO…
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…
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…
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…
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…
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.
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…
MaSo 15.10.2017 09:03
MaSo
Pro 10 prvků nemá smysl optimalizovat ani úplně první zápis.
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…
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...