Когда я сортирую Список, что происходит с его итераторами?

Давайте оставим код простым - давайте извлечем метод 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: ")); 
11
задан Daniel Rikowski 30 June 2009 в 10:58
поделиться

4 ответа

Большинство наборов в java.util "сбой быстро" и может бросить a ConcurrentModificationException если базовый набор изменяется. Нужно указать, что это предназначается для отладки и не гарантировано - также. Согласно javadocs, это верно для всех покойных AbstractList, но это не верно для CopyOnWriteArrayList, который предназначается для многопоточного использования.

16
ответ дан 3 December 2019 в 01:30
поделиться

Итераторы обычно недопустимы после любой модификации к их базовым наборам, кроме через сам итератор. (Например, ListIterator допускает вставку и удаление.)

Я, конечно, ожидал бы, что любые итераторы станут делаемыми недействительным после вида, хотя - и если бы они не были, я понятия не имел бы что порядок ожидать.

18
ответ дан 3 December 2019 в 01:30
поделиться

Обычно любой вид мутации на наборе будет делать недействительным свои итераторы. Мутация, сделанная через итератор, не будет делать недействительным тот итератор. Существуют некоторые исключительные реализации набора, такой как CopyOnWriteArrayList.

Общее решение состояло бы в том, чтобы отсортировать копию набора или воссоздать Ваши итераторы.

4
ответ дан 3 December 2019 в 01:30
поделиться

Я написал некоторый код для наблюдения то, что происходит, когда набор отсортирован, в то время как Вы выполняете итерации. Кажется, что итератор не выдает исключений, но продолжает выполнять итерации обычно. Тем не менее это дает Вам неправильные результаты, если Вы ожидаете выполнять итерации по неотсортированному набору. Посмотрите на это:

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());
    }
    }

Надежда это помогает.

2
ответ дан 3 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: