我正在制作一个链表的ArrayList,以保存电话簿的一些条目。每个姓氏以a开头的人都会出现在第一个列表中,B会出现在第二个列表中等等。但我得到了IndexOutOfBounds异常。这是我的addEntry方法。
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));
}
因此,我试图查看姓氏的第一个字母,如果它是A,则转到另一个链表元素(0),然后在那里添加Entry。
为了避免IndexOutOfBounds
,您需要确保外部列表初始化为26个条目。
您在下面使用的代码不起作用:
List<LinkedList<Entry>> phoneBook = new ArrayList<LinkedList<Entry>>(26);
它使phoneBook
的容量为26,但其大小仍然为零。您需要向phoneBook
添加26个链表。你可以这样做:
List<LinkedList<Entry>> phoneBook = new ArrayList<LinkedList<Entry>>(26);
{
for (int i = 0 ; i != 26 ; i++) {
phoneBook.add(new LinkedList<Entry>());
}
}
您还需要检查i
是否在这些范围内,否则以拉丁字母表中26个字母以外的字母开头的奇怪姓氏会导致程序崩溃。
您应该编写
LinkedList<Entry> tmp = phoneBook.get(i);
if (tmp == null) tmp = new LinkedList<Entry>();
tmp.add(new Entry(surname, initial, phoneNumber));
phoneBook.set(i, tmp);