2014-04-25 7 views
1

Je crée une ArrayList de listes liées pour contenir certaines entrées d'un annuaire téléphonique. Tout le monde avec un nom de famille commençant par A va dans la première liste, B va dans la deuxième liste, etc. J'essaie de faire en sorte que la méthode add d'une entrée apparaisse dans la liste des listes. Mais je reçois des exceptions IndexOutOfBounds. Voici ma méthode addEntry.Listes dans les listes

List<LinkedList<Entry>> phoneBook = new ArrayList<LinkedList<Entry>>(26); 

public void addEntry(String surname, String initial, String phoneNumber) { 
    Scanner sc = new Scanner(surname); 
    String word = sc.next(); 
    word = word.toUpperCase(); 
    char ch = word.charAt(0); 
    int i = ch; 
    i -= 65; 
    phoneBook.get(i).add(new Entry(surname, initial, phoneNumber)); 
} 

Je suis en train de regarder la première lettre du nom de famille, si son A, aller à l'élément (0) qui est une autre liste chaînée, puis ajoutez l'y Entrée.

Répondre

2

Afin d'éviter le IndexOutOfBounds vous devez vous assurer que votre liste externe est initialisé avec 26 entrées.

Le code que vous utilisez ci-dessous ne fonctionne pas:

List<LinkedList<Entry>> phoneBook = new ArrayList<LinkedList<Entry>>(26); 

Il donne phoneBook une capacité de 26, mais sa taille reste nulle. Vous devez ajouter 26 listes liées à phoneBook. Vous pouvez le faire comme ceci:

List<LinkedList<Entry>> phoneBook = new ArrayList<LinkedList<Entry>>(26); 
{ 
    for (int i = 0 ; i != 26 ; i++) { 
     phoneBook.add(new LinkedList<Entry>()); 
    } 
} 

Vous devez également vérifier que i est dans ces limites, sinon derniers noms étranges qui commencent dans des lettres autres que les 26 lettres de l'alphabet latin causerait votre programme crash.

0

Vous devriez écrire

LinkedList<Entry> tmp = phoneBook.get(i); 
if (tmp == null) tmp = new LinkedList<Entry>(); 
tmp.add(new Entry(surname, initial, phoneNumber)); 
phoneBook.set(i, tmp);