2016-05-27 7 views
0

Ich habe diese Methode, die Elemente aus einer Liste,Gibt dies eine leere Liste zurück?

List<LinkedList<Object>> list = new LinkedList<>(); 

, die zwei Elemente entfernt, gibt eine Liste, die Namen = queue.removePair() über eine Warteschlange gestellt wird, dann wird zu entfernen;

public List removePair() { 
    List<E> nList = new LinkedList<>(); 
    if (list.isEmpty() == true) { 
     throw new InsufficientElementsException(); 
    } 
    if (list.isEmpty() == false) { 
     Object temp; 
     for (int i = 0; i < list.size(); i++) { 
      temp = list.get(i).size(); 
      if (temp.equals(2)) { 
       nList.add((E) list.get(i)); 
       list.remove(i); 
      } 
     } 
     return nList; 
    } 

    return nList; 
} 

Ich glaube das nicht, weil nicht funktioniert, wenn ich die NList zurückkehren, nur ist das einzige, in der ersten Zeile erklärt Rückkehr? Wie behebe ich das?

+0

Haben Sie versucht, es zu debuggen? – JohannisK

+0

Wenn ich mich nicht irre, wird '(temp.equals (2))' immer fehlschlagen, weil 'temp' ein' Objekt' ist, und vergleicht daher die Speicherstellen wie in 'Object.equals' definiert. Versuchen Sie, 'temp' und' Integer' zu machen. – Zircon

+0

@Zircon: 'List.size()' gibt 'int' zurück und daher eine Zuweisung zu' Object' führt die Autobox-Umwandlung zu 'Integer' automatisch durch. Jedoch sollte "temp" an erster Stelle als "int" deklariert sein ... – fabian

Antwort

1

Sie verwenden zur gleichen Zeit Indizes zu remove und get Elementen aus der Liste. Nach einer remove wird Ihr Index falsch sein. Verwenden Sie ein Iterator in der for-Schleife statt:

for (Iterator<List<Object>> iterator = list.iterator(); iterator.hasNext();) { 
    List<Object> l = iterator.next(); 
    if (l.size() == 2) { 
     nList.add((E) l); 
     iterator.remove(); 
    } 
} 
+0

wäre dies O (n)? – alnmod

+0

@alnmod Nun, Sie durchlaufen alle Elemente in der Liste. Wenn die Liste die Größe "n" hat, muss der Algorithmus "O (n)" sein. – dejvuth

0

Ihre folgenden Code:

if (temp.equals(2)) 

gibt immer false zurück. Deshalb bekommst du immer eine leere Liste.

0

Ich habe Code geschrieben, die Ihr Problem lösen könnte. Probieren Sie es aus. Änderungen werden in den Kommentaren erwähnt.

// Used a generic class 
public class TestClass<T> where T:LinkedList<Object> 
{ 
    public List<T> list = new List<T>(); 

    public List<T> TestMethod() 
    { 
     List<T> nList = new List<T>(); 
     // Removed IsEmpty , used Count instead 
        if (list.Count == 0) { 
         //throw new InsufficientElementsException(); 
        } 
         if (list.Count > 0) { 
          int temp; 
          for (int i = 0; i < list.Count; i++) 
          { 
           // To find out the count of nodes in a particular item of the list 
           temp = list.ElementAt(i).Count; 

           T obj = list.ElementAt(i); 
           if (temp == 2) 
           { 
            nList.Add(obj); 
            list.RemoveAt(i); 
           } 
          } 
          return nList; 
         } 

     return nList; 

    } 
}