2013-11-23 1 views
0

Я новичок в Java и OOP, предыдущий язык, который я узнал, будучи C. Я пытаюсь создать Связанный список, который расширяет AbstractList и что позволяет использовать функцию Collections.sort(). Проблема в том, что когда я вызываю функцию Collections.sort(), я получаю исключение nullPointerException. Я предполагаю, что исключение связано с тем, что последний узел в моем списке является нулевым (так что я могу узнать, где заканчивается список).реализация Java Linked List (из AbstractList) дает nullPointerException в Collections.sort

class Node 
{ 
    Object o; 
    Node next; 
    public Node(Object n) 
    { 
     o = n; 
     next = null; 
    } 
} 

class LinkList extends AbstractList 
{ 
    Comparator c; 
    public Node head, last; 
    public LinkList(Comparator c) 
    { 
     this.c = c; 
     head = null; 
     last = null; 
    } 

    @Override 
    public boolean add(Object a) 
    { 
     Node t = new Node(a); 
     if(last == null) 
     { 
      head = t; 
      last = t; 
      last.next = null; 
     } 
     else //thanks, hyde 
     if(last != null) 
     { 
      last.next = t; 
      last = t; 
      last.next = null; 

     } 
     return true; 
    } 
    @Override 
    public Object get(int a) 
    { 
     Node it = head; 
     int contor = 0; 
     while(it!=null && contor<a) 
     { 
      it = it.next; 
     } 

     if(it!=null) 
     { 
      return it; 
     } 
     else 
      return null; 
    } 

@Override 
public Object set(int i, Object a) 
{ 
    Node it = head; 
    int contor = 0; 
    Node aux; 
    while(it!=null && contor<i) 
    { 
     it = it.next; 

    } 
    if(it!=null) 
    { 
     aux = it; 
     it.o = a; 
     // Collections.sort(this,c); 
     return aux; 
    } 
    else 
     return null; 
} 

@Override 
public int size() 
{ 
    Node it = head; 
    int contor = 0; 
    while(it!=null) 
    { 
     contor++; 
     it = it.next; 
    } 
    return contor; 
} 

@Override 
public int indexOf(Object a) 
{ 
    Node it = head; 
    int contor = 0; 
    while(it!=null && it.o.equals(a)==false) 
    { 
     it = it.next; 
     contor++; 
    } 
    if(it!=null) 
    { 
     return contor; 
    } 
    else 
     return -1; 
} 

} 

public class Test 
{ 
    public static void main(String args[]) 
    { 
     LinkList lista = new LinkList(new Comparator(){ 
     @Override 
     public int compare(Object o1, Object o2) 
     { 
      int s1 = (int) o1; 
      int s2 = (int) o2; 
      return s2-s1; 
     } 
     }); 
     lista.add(2); 
     lista.add(3); 
     Collections.sort(lista); //this is line 156 
     System.out.println(lista.size()); 
    } 
} 

В принципе, я добавить два элемента, и я стараюсь, чтобы отсортировать список, и я получаю NullPointerException. Это очень расстраивает, потому что я не контролирую функцию сортировки.

Exception in thread "main" java.lang.NullPointerException 
at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290) 
at java.util.ComparableTimSort.sort(ComparableTimSort.java:157) 
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146) 
at java.util.Arrays.sort(Arrays.java:472) 
at java.util.Collections.sort(Collections.java:155) 
at Ex6.main(Ex6.java:156) 
Java Result: 1 
+0

Я не смотрел исходный код 'java.util.ComparableTimSort', но почему-то я не думаю, что он сможет работать, просто называя' add'. Пожалуйста, покажите больше своих методов. –

+0

Ваш метод добавления добавляет первый узел дважды .... Используйте * else *. – hyde

+0

@RobinGreen: добавлены остальные методы. –

ответ

1

У вас не хватает contor++ в цикле внутри метода get поэтому он всегда возвращает null.

+0

Это сработало! Спасибо что подметил это. Теперь я получаю, что Node нельзя отбрасывать в java.lang.Comparable exception. Означает ли это, что я должен заставить Node реализовать Comparable и переопределить метод compareTo? –

+1

@Robertfrost hmm ... Я думаю, что на самом деле вы не должны возвращать '' Узел '' get', потому что это внутренняя деталь реализации вашей структуры данных. Если бы вы использовали дженерики, эта проблема была бы более очевидной. –

+1

Хорошая точка. Я должен был вернуть объект, хранящийся в узле. –

 Смежные вопросы

  • Нет связанных вопросов^_^