scala -> array

0

Czesc, mam problem z tablica w scali, dwie tablice a = (11,22) b = (0,1) i gdy b = 0 to chce usunac element o tym samym indeksie w a,
niestety mam ciagle blad z indeksowaniem, out of range, wie ktos jak to rozw ?

for ( x <- b){
         val index = b.indexOf(x)
         if (b(index) == 0){
           a.remove(0)
           b.remove(0)
         }
      }
2

W Scali raczej staraj się nie mutować kolekcji. Przykładowa implementacja naklepana na kolanie (nie ręczę że działa ani że się kompiluje):

  def zipAndRemoveIf[A, B](a1: Array[A], b1: Array[B])(cond: B => Boolean): List[A] = {
    a1.zip(b1).toList.flatMap {
      case (_, bElement) if cond(bElement) => None
      case (aElement, _)                              => Some(aElement)
    }
  }

W taki sposób nie masz żadnej mutacji:

  1. zipujesz dwie tablice (otrzymujesz nową o typie Array[(A, B)])
  2. zamieniasz na listę (nie pamiętam czy flatMap zadziała na tablicy gdzie typem końcowym jest Option)
  3. "Iterujesz" się po Liście Tupli (List[(A, B)])
    3.a. Jeśli wartość aktualnego elementu B spełnia warunek cond to zwracasz None (możesz rozumieć jako usuwanie elementu)
    3.b. Jeśli wartość aktualnego elementu B nie spełnia warunku cond to zwracasz aktualny element A
  4. Rezultatem są wszystkie elementy tablicy A, dla których analogiczny element B spełnił warunek cond

1 użytkowników online, w tym zalogowanych: 0, gości: 1