The sort method results in a concurrent modification error when i use temp = iterator.next(). Can you please help me resolve the concurrent modification error. I gave the code for the entire class but I'm only trying complete the sort method. Thanks in advance for your help.
I have to sort all the the arrays in the arraylist.
package HashSet;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.ListIterator;
import java.util.Scanner;
public class PhoneBook {
int capacity = 10;
private ArrayList<PhoneBookEntry>[] buckets;
public PhoneBook() {
this(10);
load();
}
public PhoneBook(int size) {
capacity = size;
buckets = new ArrayList[size];
for (int i = 0; i < buckets.length; i++)
buckets[i] = new ArrayList<PhoneBookEntry>();
}
public int getSize() {
int tot = 0;
for (ArrayList<PhoneBookEntry> x : buckets)
tot += x.size();
return tot;
}
public boolean add(PhoneBookEntry entry) {
if (contains(entry))
return false;
int x = Math.abs(entry.hashCode());
buckets[x % buckets.length].add(entry);
return true;
}
public void load() {
InputStream is = getClass().getClassLoader().getResourceAsStream(
"phone.txt");
Scanner scan = new Scanner(is);
while (scan.hasNext())
add(new PhoneBookEntry(scan.next(), scan.nextInt()));
scan.close();
}
public void bucketSize() {
for (int i = 0; i < buckets.length; i++)
System.out.println(i + " " + buckets[i].size());
}
public boolean contains(PhoneBookEntry word) {
int x = Math.abs(word.hashCode());
return buckets[x % buckets.length].contains(word);
}
public int getCapacity() {
return capacity;
}
public int getLongestList() {
int numb = 0;
for (ArrayList<PhoneBookEntry> x : buckets)
if (x.size() > numb)
numb = x.size();
return numb;
}
public void display() {
for (ArrayList<PhoneBookEntry> x : buckets)
System.out.println(x);
}
public int getNumberOfNulls() {
int numb = 0;
for (ArrayList<PhoneBookEntry> x : buckets)
if (x.size() == 0)
numb++;
return numb;
}
public String lookup(String name) {
String numb = name + "'s number not found";
for (ArrayList<PhoneBookEntry> x : buckets)
for (int i = 0; i < x.size(); i++)
if (x.get(i).getN().equals(name))
numb = name + "'s" + " number is " + x.get(i).getNr();
return numb;
}
public int internalLookUp(String name) {
int numb = 0;
for (ArrayList<PhoneBookEntry> x : buckets)
for (int i = 0; i < x.size(); i++)
if (x.get(i).getN().equals(name))
numb = x.get(i).getNr();
return numb;
}
public void sort() {
String temp = "";
ArrayList<String> list = new ArrayList<String>();
ListIterator<String> iterator = list.listIterator();
final ArrayList<PhoneBookEntry>[] data = buckets.clone();
for (ArrayList<PhoneBookEntry> x : buckets) {
for (int i = 0; i < x.size(); i++) {
list.add(x.get(i).getN());
}
Collections.sort(list);
for (int b = 0; b < x.size(); b++) {
temp = iterator.next(); //error line
x.get(b).setN(temp);
x.get(b).setNr(internalLookUp(temp));
}
}
}
public static void main(String[] args) {
PhoneBook phone = new PhoneBook();
phone.display();
System.out.println();
System.out.println("Capacity is " + phone.getCapacity());
System.out.println();
System.out.println("Size is " + phone.getSize());
System.out.println();
System.out.println("Get longest list " + phone.getLongestList());
System.out.println();
System.out.println("Number of Nulls " + phone.getNumberOfNulls());
System.out.println();
System.out.println(phone.lookup("Fish"));
phone.sort();
}
}
It looks like your problem is that you're creating an iterator for a list, then modifying the list (adding + sorting), then attempting to use the iterator.
If you instead created the iterator after this, it should work.
eg.
for (ArrayList<PhoneBookEntry> x : buckets) {
for (int i = 0; i < x.size(); i++) {
list.add(x.get(i).getN());
}
Collections.sort(list);
ListIterator<String> iterator = list.listIterator(); // Iterator created here
for (int b = 0; b < x.size(); b++) {
temp = iterator.next(); //error line
x.get(b).setN(temp);
x.get(b).setNr(internalLookUp(temp));
}