Array nach löschen nicht doppelt belegen ???

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Array nach löschen nicht doppelt belegen ???

    Hallo

    ich habe ein Array mit 3 Werten od mehr

    z.B ID0 .... ID 1... und ID2... gehe ich nun hin und lösche ich ID 1 und möchte ich ein neues einfügen
    wird ID2 doppelt angegeben und nicht die fehlende ID eingefügt - welche Möglichkeiten habe ich dies zu umgehen entweder das ID1 wieder belegt
    wird oder hinten angefügt wird.

    Leider habe ich in meinen Lehrgangsmaterialen und Swift3 vom Kofler nichts passendes gefunden oder übersehen.

    Gruss Bow
  • Arrays speichern Werte nicht mit IDs, sondern als eine sortierte geordnete Menge mit Indizes. Wenn Du drei Elemente hast und das mittlere entfernst, wird das letzte Element mit einem anderen Index angesprochen als vor der Löschung. Works as designed.

    Du solltest Dein Problem etwas präzisieren bzw. wie von @MCDan erwähnt etwas Source-Code liefern ... so ist es wie Kaffeesatzlesen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: sortiert -> geordnet

  • Hallo mache gerade nen Kurs bei I.. und bin mit den gestellten Materialen am Ende, es wird nur oberflächlich angekratzt

    der erste weg funktioniert das das Array wird angelegt , es kann auch ausgelesen werden.
    mein Problem besteht darin, das es irgendwie möglich sein muss keine doppelten Einträge in wgNr einzufügen.

    als weiteres finde ich keinen Weg das Array zu ändern (Abbruch) löschen klappt auch nicht.

    das array wird über die wgNr angesprochen sobald alle Daten eingegeben werden kommt es zum Abbruch.

    mal so nebenbei. welche verständliche Lektüre gibt es in dem jede Möglichkeit angesprochen wird wie dies hier.
    frust macht sich breit.

    Quellcode

    1. import Foundation
    2. struct Kiste {
    3. var wgNr = 0
    4. var wg = ""
    5. var breite = 0.0
    6. var hoehe = 0.0
    7. var laenge = 0.0
    8. var volumen = 0.0
    9. }
    10. var Bestand = [Kiste]()
    11. func erstelleKisteBestand(nummer : Int) -> Kiste{
    12. var tempKiste = Kiste()
    13. var eingabeDouble : Double
    14. var eingabeWgNr : Int
    15. var eingabeWg : String
    16. var _ : Double
    17. // Eingabe Daten
    18. print("Geben Sie bitte die Warengruppennummer ein")
    19. eingabeWgNr = Int(readLine()!)!
    20. tempKiste.wgNr = Int(eingabeWgNr)
    21. print("Geben Sie die Warengruppe der Kiste mit der WgNr \(tempKiste.wgNr)ein:")
    22. eingabeWg = readLine()!
    23. tempKiste.wg = (eingabeWg)
    24. print("Geben Sie die Breite der neuen Kiste mit der WgNr \(tempKiste.wgNr) ein:")
    25. eingabeDouble = Double(readLine()!)!
    26. tempKiste.breite = Double(eingabeDouble)
    27. print("Geben Sie die Länge der neuen Kiste mit der WgNr \(tempKiste.wgNr) ein:")
    28. eingabeDouble = Double(readLine()!)!
    29. tempKiste.laenge = Double(eingabeDouble)
    30. print("Geben Sie die Höhe der neuen Kiste mit der WgNr \(tempKiste.wgNr) ein:")
    31. eingabeDouble = Double(readLine()!)!
    32. tempKiste.hoehe = Double(eingabeDouble)
    33. //Berechug des Voulumen
    34. tempKiste.volumen = tempKiste.breite * tempKiste.laenge * tempKiste.hoehe
    35. print("Das Volumen Ihrer Kiste mit der ID \(tempKiste.wgNr) ist \(tempKiste.volumen) ")
    36. print()
    37. print("Die Kiste wurde erstellt und dem Lagerbestand hinzugefügt!")
    38. print()
    39. return tempKiste
    40. }
    41. func erstellen() {
    42. let neueKiste = erstelleKisteBestand (nummer: 0)
    43. Bestand.append(neueKiste)
    44. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bow ()

  • Guten Morgen
    Hallo schreibe es per PN, da ich nicht weiß ob man es öffentlich machen darf.

    zur Info: ich habe den Code anders gelegt da es mit der automatischen ID nicht klappte
    bei der Anlage des gelöschten eintrages wurde die ID doppelt belegt, dafür habe ich mich für eine
    manuelle Eingabe entschieden.

    Gruss Bow

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bow ()

  • Hallo ich habe noch ein Verständnisproblem :(
    in meiner Aufgabe.

    beim löschen oder ändern eines Eintrages wird diese doch generell über die ID angesprochen oder ???

    in diesem Fall soll es aber über die Artikelnummer (Nummer) geändert werden, da die ID nicht sichtbar
    was natürlich nicht geht - da immer die ID angesprochen wird und nicht die Artikelnummer (Nummer).


    grüß Bow


    Brainfuck-Quellcode

    1. import Foundation
    2. struct Kiste {
    3. var nummer = 0
    4. var name = ""
    5. var breite = 0.0
    6. var hoehe = 0.0
    7. var laenge = 0.0
    8. var volumen = 0.0
    9. }
    10. var kistenArray = [Kiste]()
    11. func einlesen(nummer : Int) -> Kiste{
    12. var tempKiste = Kiste()
    13. print("\(tempKiste)")
    14. print()
    15. print("Erfassen Sie die Artikelnummer für ihre Kiste ",terminator:"")
    16. tempKiste.nummer = Int(readLine()!)!
    17. print("Bitte geben Sie einen Namen ein:",terminator:"")
    18. tempKiste.name = readLine()!
    19. print("Bitte geben Sie die Breite der Kiste ein:",terminator:"")
    20. tempKiste.breite = Double(readLine()!)!
    21. print("Bitte geben Sie die Höhe der Kiste ein:",terminator:"")
    22. tempKiste.hoehe = Double(readLine()!)!
    23. print("Bitte geben Sie die Länge der Kiste ein:",terminator:"")
    24. tempKiste.laenge = Double(readLine()!)!
    25. //Berechnen des Volumens
    26. tempKiste.volumen = tempKiste.breite * tempKiste.laenge * tempKiste.hoehe
    27. print("Das Volumen der Kiste mit der ID ist \(tempKiste.volumen)")
    28. return tempKiste
    29. }
    30. func erstellen() {
    31. let neueKiste = einlesen(nummer: 0)
    32. kistenArray.append(neueKiste)
    33. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Bow ()

  • Wenn Du unbedingt ein Array verwenden willst/musst, dann musst Du den Zugriff auf die Kisten für das Löschen, Ändern und die Detail Abfrage ändern. Du darfst tempKiste.nummer dann nicht als Index für das Array verwenden, sondern musst über das Array iterieren und die Kiste mit der gewünschten tempKiste.nummer "suchen".

    Das Problem entsteht beim Löschen von Kisten. Denke mal darüber nach, wie sich das Array, z.B. mit 5 Kisten, nach dem Löschen einer Kiste auf dem Index 2 verändert hat, also wie die tempKiste.nummer der jeweiligen Kisten zum Index der Kiste im Array passt. ;)
  • An dieser Stelle noch einmal - wie schon @torquato erwähnt - der Link zum Thread aus dem letzten Jahr. Auch dort kam die Frage nach dem Umgang mit gelöschten Kisten und wie beim nächsten Anlegen neue IDs vergeben werden könnten. Ich habe zumindest ein starkes Déjà vu und mich würde wirklich interessieren, von welchem Kurs hier die Rede ist ... :)

    Zum Problem: Wenn ein Array zwingend ist, muss Du die ID als Eigenschaft einer Kiste in deren Struktur abbilden. Dann würde ich mir Hilfsfunktionen schreiben, die mir die Kiste zu einer ID suchen bzw. eine neue ID ermitteln. Andernfalls ist der Ansatz über ein Dictionary wesentlich eleganter, da Du dort direkt über eine Identifikation auf die Kisten-Struktur zugreifen kannst. Beim Neuanlegen müsstest Du aber dennoch z. B. durch Iteration eine neue ID ermitteln.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Bow schrieb:

    in dem Kurs/ Heften ist dies nicht angesprochen wie man dies umgeht (iterieren = grosse ???).
    Iterieren heisst, dass Du schrittweise durch das Array gehst und für jedes Element die gleiche Aktion wiederholst (daher Iteration, itere = wiederholen). In Deinem Fall müsstest Du also z. B. zum Finden einer Kiste mit einer gegebenen ID alle Kisten durchlaufen und deren ID mit dem Suchbegriff vergleichen. Oder Du müsstest - zum Vergeben einer neuen ID - alle Kisten durchlaufen, um die höchste verwendete ID zu ermitteln.

    Bei einer Löschung wird der Unterschied zwischen Array-Index und ID am deutlichsten, da sich die Indizes aller Kisten nach dem gelöschten Element verschieben, während die IDs (natürlich) gleich bleiben:

    Vor der Löschung zum Beispiel:
    1. Kiste -> "001"
    2. Kiste -> "002"
    3. Kiste -> "003"
    Nach Löschung der Kiste "002"
    1. Kiste -> "001"
    2. Kiste -> "003"
    Nun bleibt zu entscheiden, welche ID eine neue Kiste bekommen soll: "002" (weil erste freie), "004" (weil IDs NIE doppelt vergeben werden) oder eine ganz andere, weil IDs vielleicht gar keinem Muster folgen müssen, sondern nur eindeutig sein sollen.

    Ich hoffe, diese Denkanstösse helfen Dir weiter.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MyMattes ()