WebHU - Programozási kérdések és válaszok

Határozza meg, hogy a következő érték a tömbben ismétlődő-e

Olyan módszert keresek, amely észleli, hogy a következő érték egy tömbben ismétlődő-e, és ha igen, törli. Működnie kell karakterláncok és egész számok esetén is.

Például adott a tömbnek:

arr = ["A", "B", "B", "C", "c", "A", "D", "D"]

Visszatérés:

arr = ["A", "B", "C", "c", "A", "D"]

Megpróbáltam létrehozni egy üres a tömböt, és belelapátolni az értékeket, feltéve, hogy a következő érték nem egyenlő az aktuális értékkel. Én így próbáltam:

arr.each do |x|
  following_value = arr.index(x) + 1
  a << x unless x == arr[following_value]
end

Sajnos ahelyett, hogy az egyik ismétlődő értéket belapátolta volna a tömbbe, egyiket sem lapátolta be.

arr = ["A", "C", "c", "A"] 

Tud valaki segíteni? Bónuszpontok, ha elmondod, hogy pontosan mi rontott el a módszeremmel.

Kösz!

28.06.2017

  • Van valami ok, amiért nem szeretné használni a ["A", "B", "B", "C", "c", "A", "D", "D"].uniq alkalmazást? 28.06.2017
  • @katafrakt, eltávolítja a A-t, ahogy úgy tudom, az OP elemet akar venni, ha a következő nem egyenlő vele 28.06.2017
  • @katafrakt: A kérdés kissé homályos, de úgy tűnik, hogy az OP csak egyenlő elemek egymást követő futtatását akarja tömöríteni. 28.06.2017
  • Igen, mert nem csak az egyedi értékeket szeretném visszaadni. Csak akkor szeretném törölni az elemet, ha megegyezik az előző elemmel. Az Ön által idézett példában mindkét bejegyzést meg szeretném tartani A-val. 28.06.2017
  • A módszer nem működik, mert a arr.index(x) mindig az első egyező elem indexét adja vissza. A részletekért kérem, vegye figyelembe a válaszomat 29.06.2017

Válaszok:


1

Először is itt van egy egyszerűbb megoldás:

> arr.delete_if.with_index { |e, ind| e == arr[ind+1] }
#=> ["A", "B", "C", "c", "A", "D"]

De ez a megoldás arr mutálódik. Íme egysoros megoldások mutációk nélkül:

arr.each_with_index.with_object([]) { |(e, ind), res| res << e if e != arr[ind+1] }
arr.each_with_object([]) { |e, res| res << e if res.last != e }

A problémád ebben a sorban: a << x unless x == arr[following_value] Azt mondod: tedd ezt a element-et result-ba, ha a next element nem egyenlő vele. Ehelyett tehát mondhat valamit: tegye ezt az elemet eredménybe, ha az eredmény utolsó eleme nem egyenlő vele:

arr.each do |x|
  a << x unless a.last == x
end
28.06.2017
  • Ez a megoldás tökéletes, köszönöm Alex. Mindent elfelejtettem with_index-ről. Nem akarok ostobának tűnni, de még mindig nem vagyok 100%-ig biztos benne, hogy a példám miért nem működött. Azt hittem, hogy megtörténik: A != B, tehát lapát a-ba; B == B, tehát ne lapátoljon a-ba; B != C, tehát lapáttal a. Érted, mire gondolok? És még egyszer köszönöm, az összes példád rendkívül hasznos. :) 28.06.2017
  • A tömb#delete_if ugyanaz, mint a Array#reject! , amely támpontot ad ahhoz, hogy a kezdeti metódus hogyan módosítható a arr mutációjának elkerülése érdekében. :-) 29.06.2017

  • 2

    Én a select parancsot használnám, így csinálj valami ilyesmit:

    a = ["A", "B", "B", "C", "c", "A", "D", "D"]
    
    # without mutation
    b = a.select.with_index { |e, i| a[i+1] != e }
    a #=> ["A", "B", "B", "C", "c", "A", "D", "D"]
    b #=> ["A", "B", "C", "c", "A", "D"]
    
    # with mutation
    a.select!.with_index { |e, i| a[i+1] != e }
    a #=> ["A", "B", "C", "c", "A", "D"]
    

    BTW a módszer nem működik, mert arr.index(x) visszaadja az első objektum indexét, amelyre a blokk igaz:

    arr = ["A", "B", "B", "C", "c", "A", "D", "D"]
    arr.each do |x|
      puts "#{x} has index #{arr.index(x)}"
    end
    A has index 0
    B has index 1
    B has index 1 # you were expecting 2
    C has index 3
    c has index 4
    A has index 0 # you were expecting 5
    D has index 6
    D has index 6 # you were expecting 7
    
    28.06.2017
  • Gabriel, mindkét megoldásod remek. Továbbá nagyon köszönöm, hogy elmagyaráztad, miért nem működött a módszerem! Az őrületbe kergetett haha. Nagyon értékelem a magyarázatot. +1 29.06.2017
  • a arr.index(x)-ről - ez hibás, amint látja, az OP a following_value-t arr.index(x) + 1-ként határozza meg, és utána: x == arr[following_value] :) 29.06.2017
  • @AlexGolubenko arr.index(x) az elsőnél "B" 1, tehát following_value 2 (1 + 1). És arr.index(x) a másodiknál ​​"B" is 1, tehát following_value is 2 (1 + 1). Mint mondtam, a arr.index(x) az első objektum indexét adja vissza, amelyre a blokk igaz, ezért ebben az esetben nem használhatja ezt a metódust - ez az, ami az OP metódussal hibásodott meg. 29.06.2017

  • 3

    Íme egy tömör alternatíva:

    arr = ["A", "B", "B", "C", "c", "A", "D", "D"]
    
    arr.chunk(&:itself).map(&:first)
    # => ["A", "B", "C", "c", "A", "D"]
    

    Tekintse meg a repl.it oldalon: https://repl.it/JGV4/1

    28.06.2017

    4

    A ebből a válaszból származik Cary Swoveland:

    def remove_consecs ar
      enum = ar.each
      loop.with_object([]) do |_, arr|
        curr = enum.next
        nxt = arr.last || enum.peek
        arr << curr if curr != nxt
      end
    end
    
    remove_consecs ["A", "B", "B", 'D', "C", "c", "A", "D", "D"]
    #=> ["A", "B", "D", "C", "c", "A", "D"]
    
    28.06.2017
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..