Давайте оставим код простым - давайте извлечем метод InputInteger
; Другое предложение - использовать TryParse
вместо исключения исключений :
private static int InputInteger(string title) {
Console.WriteLine();
// Keep on asking user
while (true) {
if (!string.IsNullOrEmpty(title))
Console.Write(title);
// if correct integer value provided, return it
if (int.TryParse(Console.ReadLine(), out var result))
return result;
// in case of syntax error print the message
Console.WriteLine("-- ERROR --");
Console.WriteLine("Please, type integer number, try again!");
}
}
Затем вы можете использовать его, когда захотите ввести целочисленное значение пользователем:
int svar = InputInteger("How many items would you like to have in the list?");
...
// get svar integer items
for (int i = 0; i < svar; ++i)
myList.Add(InputInteger("Write the number you would like to add to your list: "));
Большинство наборов в java.util
"сбой быстро" и может бросить a ConcurrentModificationException
если базовый набор изменяется. Нужно указать, что это предназначается для отладки и не гарантировано - также. Согласно javadocs, это верно для всех покойных AbstractList
, но это не верно для CopyOnWriteArrayList
, который предназначается для многопоточного использования.
Итераторы обычно недопустимы после любой модификации к их базовым наборам, кроме через сам итератор. (Например, ListIterator
допускает вставку и удаление.)
Я, конечно, ожидал бы, что любые итераторы станут делаемыми недействительным после вида, хотя - и если бы они не были, я понятия не имел бы что порядок ожидать.
Обычно любой вид мутации на наборе будет делать недействительным свои итераторы. Мутация, сделанная через итератор, не будет делать недействительным тот итератор. Существуют некоторые исключительные реализации набора, такой как CopyOnWriteArrayList
.
Общее решение состояло бы в том, чтобы отсортировать копию набора или воссоздать Ваши итераторы.
Я написал некоторый код для наблюдения то, что происходит, когда набор отсортирован, в то время как Вы выполняете итерации. Кажется, что итератор не выдает исключений, но продолжает выполнять итерации обычно. Тем не менее это дает Вам неправильные результаты, если Вы ожидаете выполнять итерации по неотсортированному набору. Посмотрите на это:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("D");
list.add("B");
list.add("A");
list.add("C");
list.add("E");
Iterator<String> it = list.iterator();
String s = it.next();
System.out.println(s);
s = it.next();
System.out.println(s);
Collections.sort(list);
Iterator<String> it2 = list.iterator();
s = it.next();
System.out.println(s);
s = it.next();
System.out.println(s);
s = it.next();
System.out.println(s);
while (it2.hasNext()) {
System.out.println(it2.next());
}
}
Надежда это помогает.