13 Stimmen

Wie kann ich das erste Element eines Arrays in Objective-C entfernen?

In Objective C gibt es eine Methode oder eine kleine Möglichkeit, um das erste Element eines Arrays zu entfernen (um eins zu verkürzen) und unabhängig vom Index zurückzugeben?

0 Stimmen

Sprechen Sie von einem simplen C-Style-Array oder von einem NSArray/NSMutableArray?

1 Stimmen

Im Falle eines nackten C-Style-Arrays sind Sie schon vor dem Start in Schwierigkeiten: C-Style-Arrays enthalten keine Informationen über ihre Grenzen/gültige Größe. Ich vermute, Sie könnten einen Zeiger auf die gültige Größe übergeben, aber das wird hässlich...

1 Stimmen

Then again, for a C-style array, *p++ accomplishes something very like a shift.

24voto

Jeffrey Hantin Punkte 34609

Ich kenne keine Methode, die das entfernte Element zurückgibt, aber Sie können dies mithilfe einer Kombination von NSArray#objectAtIndex:0 und NSMutableArray#removeObjectAtIndex:0 tun. Ich vermute, Sie könnten eine neue Methodenkategorie in NSMutableArray einführen, die eine shift-Methode implementiert.

0 Stimmen

Ich war unter dem Eindruck, dass, wenn ich removeObjectAtIndex:0 entfernt hätte, ich mit einem Array übrig bleiben würde, das mit einem Index von 1 beginnt, wie man es in PHP finden kann. Aber wie sich herausstellt, reicht es aus, diese eine Position zu entfernen (es ist die älteste, die ich dem Array hinzugefügt habe), für das, was ich tue.

1 Stimmen

Die verlinkte Dokumentation besagt, dass es sich ähnlich wie Shift verhält und die anderen Elemente nach unten schiebt.

0 Stimmen

Wenn Sie wirklich nur einen Methodenaufruf möchten, sehen Sie sich meine Antwort auf eine Beispielskategorieerklärung an, die hinzufügt, was Sie brauchen.

4voto

Bill K Punkte 61074

Das wäre eine schlechte Sache zu tun.

Objective-C auf dem iPhone kann tatsächlich die meisten Leistungsverbesserungen von C nutzen.

Wenn Sie sich einige meiner anderen Beiträge ansehen, werden Sie feststellen, dass ich entschieden gegen vorzeitige Optimierung bin, aber wenn Sie auf der C-Ebene codieren, gibt es einfach einige Dinge, die Sie nicht unnötig tun.

  • Speicher verschieben
  • Strukturen duplizieren
  • Spärlich bevölkerte Speicherblöcke zuweisen
  • innere Schleifen
  • ... (Es gibt noch viel mehr, aber mein C-Leben ist eingerostet und, wie gesagt, ich bin gegen Optimierung)

Was Sie wahrscheinlich möchten, ist eine gut implementierte Warteschlange. Etwas, das eine ausreichend große zirkuläre Speicherstruktur vorab zuweist und dann zwei Zeiger hat, die die ersten und letzten Bytes verfolgen.

Ich wäre ziemlich überrascht zu hören, dass Objective-C keine Warteschlangendatenstruktur hat.

Außerdem, streben Sie nicht nach den Einzeilern. All das Zeug über knappen Code ist überbewertet. Wenn es sinnvoller ist, eine Methode aufzurufen, dann sei es so.

0 Stimmen

Perl "arrays" sind eher wie eine gut implementierte Warteschlange als ein C-Array; sie speichern Offsets zu den "ersten" und letzten Elementen und allozieren intelligent vor, wo es nötig ist.

0 Stimmen

Umso mehr Grund, eine Warteschlange in Objective-C zu verwenden. Die meisten interpretierten Sprachen sind etwa 100-mal langsamer als die kompilierten Sprachen - bei diesem Tempo sind die Anliegen völlig anders und es ergibt absolut Sinn, dass alle Arrays den Mehraufwand einer Warteschlange haben, aber so etwas wirst du in den C-basierten Sprachen nicht finden.

2voto

StilesCrisis Punkte 15626

Es ist sicherlich zu spät, um dem Originalautor zu helfen, aber wenn Sie ein einfaches NSArray und kein NSMutableArray haben, funktioniert dies gut:

id myData = myArray.firstObject;
myArray = [myArray subarrayWithRange:NSMakeRange(1, myArray.count - 1)];

0 Stimmen

Sofern Ihr Array nur ein Element enthält, bei dem der Wert loc 1 außerhalb des NSArray liegt und Sie eine NSRangeException auslösen.

1voto

Blindy Punkte 59463

Wenn Sie ein Array obj *arr haben, wobei obj eine Klasse/ein Typname ist und arr das Array ist, können Sie einfach arr+1 sagen, um das Array ohne das erste Element zu erhalten.

0voto

Nithinbemitk Punkte 2690

Verwenden Sie diesen Code,

 [arrayName removeObjectAtIndex:0];

dies könnte Ihnen helfen

0 Stimmen

Dies liefert keine zusätzlichen nützlichen Informationen, die die akzeptierte Antwort nicht bereits bereitgestellt hat, und funktioniert nur im Fall eines NSMutableArray (nicht NSArray)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X