Archief - 2 arrays met elkaar vergelijken

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

jehan

Legacy Member
In het project waar ik momenteel aan bezig ben moet ik 2 arrays van objecten met elkaar vergelijken op volgende manier:
- Array A met array B en indien een element in B niet aanwezig is: verwijderen uit array A
- Array B met array A en indien een element in A niet aanwezig is:
object aanmaken in A

Mijn huidig algoritme is volgende:

Code:
foreach (OBJ o in arrA)
{
  foreach (OBJ oo in arrB)
  {
  //code voor vergelijken etc
  }
}

Dit dan nogmaals maar dan omgekeerd.

Nu, dit werkt, maar het lijkt me zo omslachtig te zijn. Is er geen snellere manier / algoritme om dit te bereiken?

Albireo

Legacy Member
Is de uitkomst daarvan niet altijd dat array A hetzelfde wordt als array B?

A -> {1,3,4,6,7}
B -> {1,2,3,5,8}

stap 1. alles uit A verwijderen wat niet in B zit: 4, 6 en 7
A -> {1,3}
B -> {1,2,3,5,8}

stap 2. in A alle elementen aanmaken die in B zitten maar nog niet in A: 2, 5 en 8
A -> {1,3,2,5,8}
B -> {1,2,3,5,8}

Gurdt

Legacy Member
Inderdaad, vergelijken is hier maar een kleine stap.
Jouw algoritme runt in n² tijd, maar het kan ook beter. Je loopt dan eerst over alle objecten van B en daarna over alle objecten van A. Maar met "kleine" arrays maakt dat echt niets uit, dan is jouw methode zeker goed.

NeverwinterX

Legacy Member
Albireo zei:
Is de uitkomst daarvan niet altijd dat array A hetzelfde wordt als array B?

A -> {1,3,4,6,7}
B -> {1,2,3,5,8}

stap 1. alles uit A verwijderen wat niet in B zit: 4, 6 en 7
A -> {1,3}
B -> {1,2,3,5,8}

stap 2. in A alle elementen aanmaken die in B zitten maar nog niet in A: 2, 5 en 8
A -> {1,3,2,5,8}
B -> {1,2,3,5,8}

Ja ik kom tot dezelfde conclusie. Kopieer dan gewoon B naar A? :p

jehan

Legacy Member
NeverwinterX zei:
Ja ik kom tot dezelfde conclusie. Kopieer dan gewoon B naar A? :p

Misschien slecht uitgelegd. Maar het object in de array moet niet toegevoegd/verwijderd worden, er moet gewoon een bepaalde actie uitgevoerd worden die iets toevoegt/verwijdert in een applicatie die de eigenschap heeft van dat object.

Concreet:
Ik lees uit een sqldb een resem kalendergegevens waarvan ik per persoon een array aanmaak met de gegevens die van toepassing zijn (elke persoon heeft x-aantal afspraken).
Deze worden dan in men applicatie geschreven indien deze er nog niet instaan.
En omgekeerd: indien er een afspraak in de applicatie staat die niet in de sql staat, verwijder ik deze uit de applicatie. (de sqldb bevat maw altijd de correcte gegevens).

Messias.

Legacy Member
Verzamelingenleer to the recue!

A = "verzameling van kalendergegevens in databank"
B = "verzameling van kalendergegevens in applicatie"

Dan is A \ B de verzameling van kalendergegevens in A die niet in B zitten. De collection-api van Java bevat bijvoorbeeld een methode #removeAll() die het verschil tussen twee Collections teruggeeft. Het verschil tussen A en B zou je op dan op deze manier kunnen bepalen:

Code:
verschil = a.clone();      // alles uit de db
verschil.removeAll(b); // minus de gegevens die je reeds hebt

Cycloon

Legacy Member
Mja, 9 kansen op 10 gebeurt er achter de schermen net hetzelfde als wat de TS heeft gepost. Het wiel heruitvinden heeft natuurlijk ook geen zin, maar naar snelheid toe valt hier zeer weinig te winnen. Mochten er op diezelfde collectie nog acties uitgevoerd moeten worden dan was het wel beter om andere structureren te raadplegen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan