2016-04-22 2 views
0

Ich habe eine Methode, die ein Objekt zu einem Array hinzufügt, aber es fügt es basierend auf Reihenfolge hinzu. Also sagen wir, ich habe ein Array mit einem Apfel und Cola. Wenn ich eine Banane hinzufügen wollte, würde sie zwischen diese beiden Objekte gehen. Aber ich bekomme immer wieder Fehler, wenn ich meine jUnit-Tests durchführe. Hier ist der Code:fügen Sie etwas zu einem Array basierend auf Auftrag

/** 
* Adds an item to the list. This method assumes that the list is already 
* sorted in alphabetical order based on the names of the items in the list. 
* 
* The new item will be inserted into the list in the appropriate place so 
* that the list will remain alphabetized by names. 
* 
* In order to accomodate the new item, the internal array must be re-sized 
* so that it is one unit larger than it was before the call to this method. 
* 
* @param itemToAdd refers to a Listable item to be added to this list 
*/ 

public void add(Listable itemToAdd) { 

    int i; 
    Listable[] newItems = new Listable[items.length+1]; 
    for(i=0; i<items.length;i++){ 
     if(items[i].getName().compareTo(itemToAdd.getName()) < 0){ 
      newItems[i] = items[i]; 
     } else{ 
      break; 
     } 
    } 
    int str=i; 
    for(i=str+1;i<items.length;i++){ 
     newItems[i+1] = items[i]; 
    } 
    newItems[str] = itemToAdd; 
} 

Ich halte einen Fehler bekommen, das besagt, dass der Test < 14 erwartet> bekam aber < 0> so jetzt denke ich, das bedeutet, es ist mein Konstruktor das ist das Problem:

/** 
* This constructor creates an empty list by creating an internal array 
* of size 0. (Note that this is NOT the same thing as setting the internal 
* instance variable to null.) 
*/ 
public SortedListOfImmutables() { 
    int i = 0; 
    items = new Listable[0]; 

    //orders the list 
    for(i=0;i<items.length;i++){ 
     if(Food.FOOD_OBJECTS[i].getName().compareTo(Food.FOOD_OBJECTS[i+1].getName()) < 0){ 
      items[i] = Food.FOOD_OBJECTS[i]; 
     }else{ 
      items[i+1] = Food.FOOD_OBJECTS[i]; 
     } 
    } 

} 
+0

können Sie auch Ihre Junit hier? Ich bin auch neugierig auf die 'Elemente', die ein leeres Array mit der Größe Null sind, und wir fügen etwas in die Schleife hinzu. Fehle ich etwas? – Wizard

+0

Und warum erwartet der Test "14"? Welcher Test, was macht er? Sie machen es sehr schwer, Ihnen zu helfen. – Meier

Antwort

0

denke ich atleast eines Ihrer Probleme mit dieser for-Schleife ist:

for(i=str+1;i<items.length;i++){ 
    newItems[i+1] = items[i]; 
} 

ich werde nur ein Beispiel Liste verwenden, um Ihnen zu zeigen, warum. Sagen wir, unsere Artikelliste enthält {Apfel, Banane, Orange, Ananas}. Dann wollen wir "Traube" einfügen, die zwischen "Banane" und "Orange" eingefügt werden soll. Die erste for-Schleife macht 3 Iterationen vor dem Brechen (indem man "apple" und "banana" in newItems setzt, bricht dann bei i = 2). Sie weisen str = 2 zu, was der Index "traube" sein soll. Aber dann, wenn die übrigen Elemente einfügen, setzen Sie i = str + 1, die 3 in diesem Fall wäre, so

newItems[i+1] = items[i]; 

setzen würde „Ananas“ in Index 4 von newItems, was richtig ist, aber sie ganz überspringen setzen was in Index 2 in Artikel ("orange") in die newItems am Index 3. um dies zu beheben, entweder Sie tun möchten:

for(i=str;i<items.length;i++){ 
    newItems[i+1] = items[i]; 
} 

oder: Post

for(i=str+1;i<items.length;i++){ 
    newItems[i] = items[i-1]; 
} 
Verwandte Themen