Java - jak vymazat z ArrayListu množinu položek

Java - jak vymazat z ArrayListu množinu položek
« kdy: 20. 09. 2019, 07:48:12 »
Mám nějaký ArrayListový seznam a k němu jsem dostal jsem dostal pole, které obsahuje indexy, jež určují, které prvky se z ArrayListového seznamu mají vymazat. Když ale začnu v cyklu promazávat ten seznam, tak dojde k rozhození indexace a tím pádem jsou ty původní indexy neplatné.

Existuje nějaký způsob, jak rychle naráz vymazat určité prvky z ArrayListu, které jsou specifikovány nějakou množinou prvků?


tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #1 kdy: 20. 09. 2019, 08:23:17 »
Když ty indexy seřadíš, tak při procházení od nejmenšího víš, o kolik jsou ty další posunuté, nebo při procházení od nejvyššího tě posunutí netrápí. Jak se na tohle můžeš ptát?

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #2 kdy: 20. 09. 2019, 09:06:56 »
Opakovaně mazat uprostřed ArrayListu je dost neefektivní.

Chceš promazat ten původní nebo ti stačí vytvořit nový s příslušným obsahem? To druhé je snadné.

Je docela dobře možné, že bude efektivní i udělat nový a jeho obsahem pak překropit ten starý, ale tam by to chtělo detaily a měření.

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #3 kdy: 20. 09. 2019, 15:40:30 »
Bud si proste vyrob novy arraylist zkopirovanim dat ve foreach cyklu, kde key not in keylist. Keylist array si preved na arraylist a pouzij contains().
Tenhle pristup je vhodny, pokud pocet klicu > polovina delky arraylist


Nebo si vyrob pomocny arraylist pro vsechny keys z keylistu a na puvodnim arraylistu zavolej removeAlll()
Tehnle pristup je vhodny pokud je pocet klicu maly vzhledem k delce arraylistu.

Nepredpokladam, ze resis kazdou milisekundu, to by nebyly daove struktury tak blbe navrzene.

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #4 kdy: 20. 09. 2019, 18:05:44 »
Strc ten arraylist do hashmapy, a v hashmape uz pak muzes mazat prvky dle klice.


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #5 kdy: 20. 09. 2019, 18:24:12 »
Strc ten arraylist do hashmapy, a v hashmape uz pak muzes mazat prvky dle klice.
Taky by si ho mohl strčit do Fibonacciho haldy.

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #6 kdy: 21. 09. 2019, 02:32:34 »
Mám nějaký ArrayListový seznam a k němu jsem dostal jsem dostal pole, které obsahuje indexy, jež určují, které prvky se z ArrayListového seznamu mají vymazat. Když ale začnu v cyklu promazávat ten seznam, tak dojde k rozhození indexace a tím pádem jsou ty původní indexy neplatné.

Existuje nějaký způsob, jak rychle naráz vymazat určité prvky z ArrayListu, které jsou specifikovány nějakou množinou prvků?

 ;)


   public static void main(final String[] args) {
      final ArrayList<Object> arrayList = new ArrayList<Object>(Arrays.asList("a", "b", "c", "d", "e"));
      System.out.println(arrayList);
      final int[] toRemoveIdxs = new int[]{0, 3, 1, 5};
      Arrays.sort(toRemoveIdxs); // pokud toRemoveIdxs jsou nesetrizeny
      
      { // algoritmus odstraneni podle indexu
         int cnt = 0;
         for (int i = 0, toRemovePtr = 0; i < arrayList.size(); i++) {
            if (cnt > 0) {
               arrayList.set(i - cnt, arrayList.get(i));
            }
            if (toRemovePtr < toRemoveIdxs.length) {
               int toRemoveIdx = toRemoveIdxs[toRemovePtr];
               if (toRemoveIdx == i) {
                  cnt++;
                  toRemovePtr++;
               }
            }
         }
         // odseknu zbytek
         arrayList.subList(arrayList.size() - cnt, arrayList.size()).clear();
      } //

      System.out.println(arrayList);
   }


Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #7 kdy: 21. 09. 2019, 15:08:19 »
Mám nějaký ArrayListový seznam a k němu jsem dostal jsem dostal pole, které obsahuje indexy, jež určují, které prvky se z ArrayListového seznamu mají vymazat. Když ale začnu v cyklu promazávat ten seznam, tak dojde k rozhození indexace a tím pádem jsou ty původní indexy neplatné.

Existuje nějaký způsob, jak rychle naráz vymazat určité prvky z ArrayListu, které jsou specifikovány nějakou množinou prvků?

 ;)
Kód: [Vybrat]

public static void main(final String[] args) {
final ArrayList<Object> arrayList = new ArrayList<Object>(Arrays.asList("a", "b", "c", "d", "e"));
System.out.println(arrayList);
final int[] toRemoveIdxs = new int[]{0, 3, 1, 5};
Arrays.sort(toRemoveIdxs); // pokud toRemoveIdxs jsou nesetrizeny

{ // algoritmus odstraneni podle indexu
...

Proč bych to měl dělat takhle, když můžu použít čitelnější postup Standy Blábola? Viz.
https://forum.root.cz/index.php?topic=21857.msg317204#msg317204

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #8 kdy: 21. 09. 2019, 22:26:13 »
Pomocí streamů:

Kód: [Vybrat]
List<String> arrList = new ArrayList<>();
arrList.add("a");
arrList.add("b");
arrList.add("c");
arrList.add("d");

Integer[] indexes = { 1, 3 };
List<Integer> indexesList = Arrays.asList(indexes);
List<String> withItemsRemoved = arrList.stream().filter(i -> !indexesList.contains(arrList.indexOf(i)))
.collect(Collectors.toList());
System.err.println(withItemsRemoved);

Output: [a, c]

Samozřejmě je nutné vzít v potaz kontext, ve kterém se tahle akce provádí a případně použít jiné performantnější řešení.
« Poslední změna: 21. 09. 2019, 22:32:02 od vitro »

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #9 kdy: 21. 09. 2019, 22:51:55 »
Jak se na tohle můžeš ptát?

Jak se na tohle můžeš ptát?

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #10 kdy: 21. 09. 2019, 23:27:14 »
Popravdě řečeno, nenapadá mě případ užití toho, co požaduješ. Evidentně si pleteš pojmy pole a seznam, z toho vzniká tohle zmatení.

ArrayList implementuje rozhraní List. Má rozhraní List metodu pro odstranění prvku podle indexu? Nemá, tak ji laskavě nepoužívej.

Abych trochu napověděl: Můžeš použít třeba metodu List.removeAll(), ta by to měla zvládnout.

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #11 kdy: 21. 09. 2019, 23:34:07 »
Proč bych to měl dělat takhle, když můžu použít čitelnější postup Standy Blábola? Viz.
https://forum.root.cz/index.php?topic=21857.msg317204#msg317204

Protoze v zadani je, ze se maji z listu prvky vymazat a ne ze se ma vytvorit novy list.
Navic je tu performance.

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #12 kdy: 22. 09. 2019, 07:22:45 »
Popravdě řečeno, nenapadá mě případ užití toho, co požaduješ. Evidentně si pleteš pojmy pole a seznam, z toho vzniká tohle zmatení.

ArrayList implementuje rozhraní List. Má rozhraní List metodu pro odstranění prvku podle indexu? Nemá, tak ji laskavě nepoužívej.

Abych trochu napověděl: Můžeš použít třeba metodu List.removeAll(), ta by to měla zvládnout.

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#remove-int-

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #13 kdy: 22. 09. 2019, 08:21:26 »
ArrayList implementuje rozhraní List. Má rozhraní List metodu pro odstranění prvku podle indexu? Nemá, tak ji laskavě nepoužívej.

nebalábol

Re:Java - jak vymazat z ArrayListu množinu položek
« Odpověď #14 kdy: 22. 09. 2019, 11:01:51 »
Díky za odpovědi, vyřešil jsem jednoduše vytvořením nového ArrayListu. Šlo mi jen o to se ujistit, zda neexistuje nějaká metoda, kterou by se to dalo sfouknout na jednom řádku kódu.